Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Что я делаю не так?
Форумы портала PHP.SU » » Вопросы новичков » Что я делаю не так?

Страниц (1): [1]
 

1. ai4051136 - 27 Сентября, 2012 - 10:22:29 - перейти к сообщению
Добрый день!
Подскажите, где моя ошибка и в чем?
Изучаю регулярные выражения и не могу понять почему не хочет работать изложенный ниже пример.
Есть у меня, например, файл (test.txt) такого вида:
CODE (html):
скопировать код в буфер обмена
  1. <html>
  2. <head>
  3. <title>интернет-магазин</title>
  4. </head>
  5. <body>
  6. <div class="page">
  7.   <div class="pu_i cutting">
  8.     <div class="ttl">Какой город ваш?</div>
  9.       <div class="cut">
  10.         <div class="choose">Выбор городов по алфавиту:</div>
  11.         <div class="for_cities">
  12.         <div class="cities">
  13.            <ul class="fst">
  14.                 <li class="let"><a href="http://almetyevsk.mysite.ru/" class="click_chose_region">Альметьевск</a></li>
  15.                 <li><a href="http://anapa.mysite.ru/" class="click_chose_region">Анапа</a></li>
  16.                 <li><a href="http://astrakhan.mysite.ru/" class="click_chose_region">Астрахань</a></li>
  17.            </ul>
  18.         <div class="uncutit"><a href="#">Все города</a> <span>&nbsp;</span></div>
  19.         <div class="cutit"><a href="#">Свернуть</a> <span>&nbsp;</span></div>
  20.         </div>
  21.       </div>
  22.     </div>
  23.   </div>
  24. </div>
  25. </body>
  26. </html>

Я хочу с помощью регулярных выражений, например, вытащить весь кусок кода между словами "Альметьевск" и "Астрахань". Пример, я конечно упростил и утрировал, но суть одна и та же.
Пытаюсь сделать так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $filename = "test.txt";
  3. $tmp_file = fopen($filename, "r");
  4. $content = fread($tmp_file, filesize($filename));
  5. fclose($tmp_file);
  6. preg_match("/(?<=Альметьевск).*(?=Астрахань)/", $content, $href);
  7. file_put_contents("href.txt", $href);
  8. print_r($href);
  9. ?>

Результат - пустой массив. Почему?
2. Alho - 27 Сентября, 2012 - 10:52:17 - перейти к сообщению
В данном случае explode будет работать быстрее.

Для того, что бы работала точка нужно её включить ключом s:
PHP:
скопировать код в буфер обмена
  1. preg_match("/(?<=Альметьевск).*(?=Астрахань)/s", $content, $href);


Лично я чаще для "любого символа" использую [\w\W], но это банальная привычка.
3. ai4051136 - 27 Сентября, 2012 - 11:41:14 - перейти к сообщению
Alho пишет:
Для того, что бы работала точка нужно её включить ключом s:

Спасибо, заработало!

Alho пишет:
В данном случае explode будет работать быстрее.

А как с помощью explode вы решите эту задачу? Не придется ли два раза использовать explode, чтобы сначала отделить один кусок кода, а потом второй, т.к. разделители разные?
(Добавление)
Alho пишет:
Для того, что бы работала точка нужно её включить ключом s:

Как я уже сказал пример заработал, но если брать вместо урезанного примера большой исходный файл, в котором порядка 4000 строк, код опять не работает.
Почему так может происходить?
4. Alho - 27 Сентября, 2012 - 12:03:06 - перейти к сообщению
Да, дважды. Но тестили и пришли к выводу, что все-равно быстрее. В пхп на редкость медленные регулярки.

Конкретный пример - в студию - разберемся.

А вообще, для правильного написания реглярок хорошо подходят текстовые редакторы с функцией поиска по регулярным выражениям - сразу очевидны недоделки.

 

Powered by ExBB FM 1.0 RC1