Шаблон php preg_match для извлечения конкретной информации, регулярное выражение - PullRequest
1 голос
/ 13 июня 2010

Мне нужно извлечь определенный идентификатор из HTML-документа, но проблема в том, что идентификатор не должен «использоваться».

Вот содержание HTML http://pastebin.com/wF2dx8JZ

Как вы можете видеть, существуют разные блоки html. Некоторые из них содержат слово «Используется», поэтому мне нужно извлечь только первый идентификатор, который не используется. По сути, я могу написать простой шаблон, например: $ pattern = "/javascript:tw(.*))/"; preg_match_all ($ pattern, $ content, $ match); $ id = $ соответствует [1] [0];

Однако в этом случае я также получаю "идентификаторы", которые используются, поэтому я не знаю, как исключить их из уравнения. Любая идея будет высоко оценена.

Ответы [ 3 ]

1 голос
/ 13 июня 2010

Попробуйте это:

if (preg_match_all('~Used.*?javascript:tw\((\d+)\)~ig', $content, $matches))
{
    print_r($matches);
}

Но, вы должны знать, есть шанс 99,9% лучшего способа сделать это. Есть ли у вас доступ к источнику данных?

0 голосов
/ 16 июня 2010

Это немного зависит от того, как ваши html-блоки хранятся в памяти.У вас есть массив строк, каждая из которых содержит HTML для одного «блока»?Если нет, то можете ли вы сделать это с помощью функции PHP explode()?(Например, $html_blocks = explode("<!---->", $all_html);, если эта последовательность комментариев на самом деле является частью ваших данных, а не чем-то, что вы добавили.)

После разделения блоков вы можете использовать preg_grep(), чтобы найти блоки, которыене содержат «используется».Так что сделайте что-то вроде этого:

$unused_blocks = preg_grep("Used", $html_blocks, PREG_GREP_INVERT);

Если вы хотите быть более осторожным в сопоставлении, вы можете использовать другое регулярное выражение в качестве первого параметра.

Теперь у вас есть $unused_blocks, чтомассив строк HTML, которые «не используются».Затем вы можете использовать уже работающий шаблон preg_match(), чтобы извлечь идентификаторы для каждого из них.

Надеюсь, что это поможет или в любом случае приблизит вас.

0 голосов
/ 13 июня 2010

использовать print_r($matches)

отредактировано:

preg_match('#\(([^)]+)\)#', $matches[1][0], $m);
echo $m[1];
...