正则表达式匹配1个HTML文件中的2个html标签

时间:2010-12-25 09:15:36

标签: php html regex html-parsing

我有一个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 个答案:

答案 0 :(得分:10)

Regex does not always provide perfect result while parsing 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] 匹配元素   没有指定的   具有特定值的属性。

     

[attribute ^ = value] 匹配元素   具有指定属性和   它以某个值开始。

     

[attribute $ = value] 匹配元素   具有指定属性和   它以某个值结束。

     

[attribute * = value] 匹配元素   具有指定属性和   它包含一定的值。

More Options


还有一些其他解析工具可以解析HTML,如this answer中所述。

答案 1 :(得分:2)

嗯,在更多的反正则表演者出现之前,我会更好地阐述。在您的情况下,它实际上适用于使用正则表达式。但是我想指出,您应该仔细评估the pros and cons

使用phpQuery或QueryPath进行此类任务大多简单:

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

但如果你不忽视细节,那么正则表达式也是可能的:

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

如果提取取决于两个标签的存在,那么这可能是更好的选择。