2015-04-17 51 views
1

我的HTML是:PHP正则表达式匹配只有特定的元素

<li> 
    <a href="/prod_1"></a> 
    <img src="/preview_1.jpg" data-image-href="//cdn.example.com/zoom_1.jpg" /> 
</li> 
<li> 
    <a href="/prod_2"></a> 
    <img src="/preview_2.jpg" data-image-href="//cdn.example.com/zoom_2.jpg" /> 
</li> 
... 

我使用这个正则表达式:

/(src|href)=("[^"]+")/siU 

结果是:

[2][0] => "/prod_1" 
[2][1] => "/preview_1.jpg" 
[2][2] => "//cdn.example.com/zoom_1.jpg" 
[2][3] => "/prod_2" 
[2][4] => "/preview_2.jpg" 
[2][5] => "//cdn.example.com/zoom_2.jpg" 
... 

加入<img.*到开始后正则表达式,得到的结果是扭曲的。我只需在IMG元素内匹配srchref属性。什么是实现这一目标的正确途径?

回答

4

可以限制匹配的字符[^>](不是关闭anlge支架),只得到了img属性:

(?:<img\s*?|(?<!^)\G)\s*?([^>=]+)="([^"]*?)"(?=.*?\/>) 

demo

添加PHP代码示例:

$re = "/(?:<img\\s*?|(?<!^)\\G)\\s*?([^>=]+)=\"([^\"]*?)\"(?=.*?\\/>)/siU"; 
$str = "<li>\n <a href=\"/prod_1\"></a>\n <img src=\"/preview_1.jpg\" data-image-href=\"//cdn.example.com/zoom_1.jpg\" />\n</li>\n<li>\n <a href=\"/prod_2\"></a>\n <img src=\"/preview_2.jpg\" data-image-href=\"//cdn.example.com/zoom_2.jpg\" />\n</li>"; 
preg_match_all($re, $str, $matches); 
+0

这个结果还没有SRC和HREF属性分别 –

+0

这应该按预期工作与他们的价值观中提取的所有属性。 –

+0

感谢大家,精彩。 –