Регулярное выражение для сопоставления 2 тегов HTML в 1 файле HTML - PullRequest
3 голосов
/ 25 декабря 2010

У меня есть HTML-файл, который содержит следующее:

<img src="MATCH1" bla="blabla">
<something:else bla="blabla" bla="bla"><something:else2 something="something">
<something image="MATCH2" bla="abc">

Теперь мне нужно регулярное выражение для соответствия как MATCH1, так и MATCH2

Также HTML содержит несколько таких частей, поэтомуможет быть в HTML 1, 2, 3 x раз ..

Когда я говорю:

<img\s*src="(.*?)".*?<something\s*image="(.*?)"

Это не соответствует.Что мне здесь не хватает?

Заранее спасибо!

Ответы [ 2 ]

10 голосов
/ 25 декабря 2010

Regex не всегда дает идеальный результат при разборе HTML.

Я думаю, вы должны сделать это, используя HTML DOM Parser

Например:

// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');

// OR Create a DOM object from a HTML file
$html = file_get_html('test.htm');

// Find all images 
foreach($html->find('img') as $element) 
       echo $element->src . '<br>';

// Find all links 
foreach($html->find('a') as $element) 
       echo $element->href . '<br>';

Существуют фильтры для получения тегов с конкретными атрибутами:

[атрибут] Соответствует элементам с указаннымattribute.

[attribute = value] Сопоставляет элементы с указанным атрибутом с определенным значением.

[attribute! = value] Matchesэлементы, у которых нет указанного атрибута с определенным значением.

[атрибут ^ = значение] Соответствует элементам, имеющим указанный атрибут, и начинается с определенного значения.

[атрибут $ = значение] Соответствует элементам, которые имеют указанный атрибут и заканчивается определенным значением.

[атрибут * = значение] Соответствует элементамкоторые имеют указанный атрибут, и он содержит определенное значение.

Дополнительные параметры

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

2 голосов
/ 25 декабря 2010

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

В большинстве случаев проще использовать phpQuery или QueryPath для таких задач:

qp($html)->find("img")->attr("src");

Но также возможно регулярное выражение, если вы не пропустите мелкие детали:

preg_match('#<img[^>]+src="([^">]*)".+?<something\s[^>]*image="([^">]*)"#ims', $html, $m);

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

...