LINUX.ORG.RU
ФорумTalks

[php][regexp] Что за фигня?

 ,


0

0

Пишу тупой парсер, нужно взять html-ку и выделить из неё title и body

preg_match('#<title>(.+)</title>#i', $html, $p)

Возращает 1. Почему же

preg_match('#<title>(.+)</title>#is', $html, $p)

возвращает 0?


Ответ на: комментарий от Deleted

судя по мануалу - два лимита для PRCE есть, но они из другой оперы.

хрен с ним, уже сделал через stripos и substr. Чувствую себя индусом :D

Ximik
() автор топика

> preg_match('#<title>(.+)</title>#i', $html, $p)
> Возращает 1. Почему же

> preg_match('#<title>(.+)</title>#is', $html, $p)

> возвращает 0?


Лучше таким образом:

preg_match('#<title>(.+?)</title>#is', $html, $p)

Плюс к этому лимиты поменять (при необходимости):

ini_set('pcre.backtrack_limit', 2000000);
ini_set('pcre.recursion_limit', 2000000);
ini_set('memory_limit', '16M');

kajematez
()
Ответ на: комментарий от Ximik

Мысли позитивнее - чувствуй себя оптимизатором. Через stripos и substr реально будет работать быстрее и жрать меньше памяти.

Ramen ★★★★
()
Ответ на: комментарий от Ximik

> Как только страница в ~100Кб - всё.

Ну тык:

pcre.backtrack_limit 100000 PHP_INI_ALL Available since PHP 5.2.0.
pcre.recursion_limit 100000 PHP_INI_ALL Available since PHP 5.2.0.

kajematez
()

Вот так работает:
"|<title>([^<]+)</title>|i"
Так ему не приходится просматривать весь файл, в виду своей жадности, а только к закрывающему тегу.

urxvt ★★★★★
()

preg_match для таких целей не подходит, нужен DOMDocument, так как тега <body> может не существовать вообще и это будет абсолютно валидный html.

RommeDeSerieux
()
Ответ на: комментарий от RommeDeSerieux

> preg_match для таких целей не подходит, нужен DOMDocument, так как тега <body> может не существовать вообще и это будет абсолютно валидный html.

ну валидностью на большинстве страниц и не пахнет.

А как без body может быть валидным? Вроде бы обязательный тег

Ximik
() автор топика
Ответ на: комментарий от isden

> видимо имелось ввиду <title>

ну тогда и парсить смысла-то нет.

Ximik
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.