[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: preg_match_all в цикле foreach что я делаю не так?
Aleks_Ku
Добрый день!
Имеются 2 txt файла: в одном разные фразы, в другом список "форм городов": например моск, питер и т.д.
Задача заключается, что бы на выходе у меня было 2 файла: фразы, которые имеют города и фразы, которые написаны без городов.

 $hnd=file_get_contents("text.txt");
$sity = file("sity.txt");

foreach($sity as $key => $value) {
preg_match_all("/^.*?'.$value.'.*$/mi",$hnd, $arr);
}
print_r($arr);

Смысл того, что хочется получить на данном этапе - ключи массива $hnd, в которых содержаться фразы из sity.txt, пробовал перебором, как показано выше, но выдает пустой массив. Если вместо '.$value.' подставлять москв - все работает нормально.

Содержимое text.txt:
купить в москве недорого
2
12
0
фывап
a0dsfs
fdg0sd
москва слезам не верит
Москва - город герой


Часть содержимого из sity.txt:
москв
Азнакаево
Азов
Азово
Айкино
Акбулак
Акбулак
Аксай
Аксарка
Аксубаево
Актаныш
Акулово
Акша

walerus
Две ошибки:
1) Если Вы используете функцию file(), то почитайте как она работает, если ее использовать в таком виде:
$sity = file("sity.txt"); 
то она добавляет перевод строки, т.е. "\n", что бы такого не было, нужно либо ставить trim() при проверке, либо же использовать флаг "FILE_IGNORE_NEW_LINES"

$sity	= file( "sity.txt", FILE_IGNORE_NEW_LINES );


2) не правильно составлена регулярка
preg_match_all("/^.*?'.$value.'.*$/mi",$hnd, $arr);
что же Вы открываете регулярное выражение в двойных кавычках, а переменную пихаете в одинарные?

правильный вид:
preg_match_all( '~.*' . $value . '.*~', $hnd, $arr);
Aleks_Ku
print_r($arr);

Возвращает мне пустой массив, даже после правок с флагом и изменения рег. выражения:
Array ( [0] => Array ( ) )
walerus
<?php
echo "<pre>";

$hnd = file_get_contents("text.txt");
$sity = file( "sity.txt", FILE_IGNORE_NEW_LINES );

echo "Наш текст:<br>\n";
print_r($hnd);

echo "<hr>Наш массив слов:<br>\n";
print_r($sity);

foreach( $sity as $key => $value )
{
echo "Ищем совпадение слова - |$value|<br>\n";

preg_match_all( '~.*' . $value . '.*~', $hnd, $arr);

if ( !empty($arr) )
{
echo "<hr>Найдены совпадения слова - |$value|, с предложениями<br>\n";
print_r($arr);
die;
}
}

результат:
Наш текст:

купить в москве недорого
2
12
0
фывап
a0dsfs
fdg0sd
москва слезам не верит
Азов - город герой
---------------------------------------------------------------------------------------
Наш массив слов:

Array
(
[0] => москв
[1] => Азнакаево
[2] => Азов
[3] => Азово
[4] => Айкино
[5] => Акбулак
[6] => Акбулак
[7] => Аксай
[8] => Аксарка
[9] => Аксубаево
[10] => Актаныш
[11] => Акулово
[12] => Акша
)
Ищем совпадение слова - |москв|
---------------------------------------------------------------------------------------------------- -----
Найдены совпадения слова - |москв|, с предложениями

Array
(
[0] => Array
(
[0] => купить в москве недорого
[1] => москва слезам не верит
)

)

разбирайтесь где у вас "не то"...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.