2013-02-14 118 views
0

我試圖找到img標籤,其中不包含alt屬性,所以要解決它的W3C驗證。負面查詢preg_match_all PHP中的IMG標籤沒有ALT屬性

我試圖使用負環視語法:

preg_match_all('@<img[^>]*?(?!alt=)[^>]*>@', $text, $matches); 

不幸的是不返回任何東西,同時有img標籤不alt屬性是肯定的。

我認爲問題是出在負查找,但是例如我用:

preg_match_all('@<img[^>]+?http:\/\/(?!mysite\.com)[^>]*?>@', $text, $matches); 

尋找外部資源的圖像和它工作得很好。

任何想法第一個表達式有什麼問題? 謝謝!

+0

**請勿使用正則表達式來解析HTML **。您無法可靠地使用正則表達式解析HTML。只要HTML從你的期望改變,你的代碼就會被破壞。有關如何使用PHP模塊正確解析HTML的示例,請參閱http://htmlparsing.com/php.html。 – 2013-02-14 22:15:41

+0

我不會在生產環境中使用simple_html_dom,因爲它有內存泄漏。這就是爲什麼我前一陣子拒絕了,現在就使用nokogiri。這真的取決於是否使用正則表達式爲我的目的,我認爲這將適合罰款。 – Volder 2013-02-14 22:26:56

回答

2

終於讓我找到工作的解決方案:

preg_match_all('@<img(?:(?!alt=).)*?>@', $text, $matches); 

感謝貢獻。

+0

哇,我完全不知道爲什麼這個工作原理。爲什麼會這樣工作,但'@img(?!alt =)。*?> @''不起作用? – Eric 2013-02-14 21:24:09

+0

我不完全瞭解所有這些東西,但是您提供的東西似乎是在之後立即搜索沒有alt = =的img標籤。 – Volder 2013-02-14 21:29:06

1

使用前瞻語法工作與第一個

preg_match_all('@<img[^>]*?(?=alt=)[^>]*>@', $text, $matches); 

$這裏比賽將只包含IMG與ALT的。

<?php 
$str = <<<EOF 
<html> 
    <body> 
    hello 
    <img src="withalt" alt="hi"/>asdf 
    <img src="noalt" /> 
    <img src="withalt2" alt="blah" /> 
    </body> 
</html> 
EOF; 

if (preg_match_all('@<img[^>]*?(?=alt=)[^>]*>@', $str, $matches)) { 
    echo "matches\n"; 
    print_r($matches); 
} 

?> 
+0

這仍然不會返回任何東西。它在你身邊工作嗎?據我所知,你使用積極的前瞻性,但想法是找到那些不包含ALT屬性的標籤,所以我用負面預測(?!)。 – Volder 2013-02-14 20:57:03

+0

只是用工作代碼做了一個編輯,當然我忘記了你想要的行不包含alt,所以暫時擱置一分鐘,我會看到我能想出什麼 – Eric 2013-02-14 21:00:50

相關問題