PHP, preg_match, регулярные выражения. Что я делаю неправильно? - PullRequest
0 голосов
/ 13 ноября 2009

Вот образец, которому я хочу соответствовать:

<div class="class">
<a href="http://www.example.com/something"> I want to be able to capture this text</a>
<span class="ptBrand">

Вот что я делаю:

$pattern='{<div class="productTitle">[\n]<((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)>([^\n]*)</a>[\n]<span class="ptBrand">}';

preg_match($pattern, $data, $matches,PREG_OFFSET_CAPTURE);

print_r($matches);

Он печатает:

Array ()

Ответы [ 4 ]

5 голосов
/ 13 ноября 2009

Как правило, регулярные выражения являются очень плохим средством парсинга HTML. Они ненадежны и имеют тенденцию быть действительно сложными. Гораздо более надежное решение - использовать анализатор HTML. См. Разбор HTML с PHP и DOM .

Что касается вашего выражения, я не вижу <div class="productTitle" нигде в источнике, поэтому я бы начал с него. Точно так же вы пытаетесь проанализировать URL-адрес, но нет упоминания о теге привязки (либо напрямую, либо через достаточный подстановочный знак), поэтому он тоже потерпит неудачу. По сути, это выражение не похоже на HTML, который вы пытаетесь разобрать.

1 голос
/ 23 ноября 2011

... или это:

preg_match('/\s*([^>]+)\s*<\/a/',$string,$match);

Обрезает это тоже.

0 голосов
/ 13 ноября 2009

Вы можете попробовать это:

<a href=".*?">([\s\S]*?)</a>
0 голосов
/ 13 ноября 2009

Узор:

/<div class="class">\s*<a href=\"([^"]+)\">([^<]+)</a>/m

Получил бы ссылку и текст примерно, но использование библиотеки DOM было бы намного лучшим способом.

...