2015-04-17 82 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

感謝大家,精彩。 –