2013-08-20 24 views
1

所以我一直試圖使用一些正則表達式從<a href='#' >HTML a tag</a>中提取信息,以獲取可能標記的三個獨立模式。正則表達式preg_match_all用於檢索名稱,ID和hrefs的HTML標記

<a id="Anchor_One" name="Anchor_One"> Anchor Details </a> 
<a href="#Anchor_Two" name="Anchor_Two" > Anchor Two Details </a> 
<a name="Anchor_Three" > Anchor Three Details </a> 

到目前爲止,我有一些正則表達式來提取所有從給定的HTML標籤/(\\w+)\s*=\\s*("[^"]*"|\'[^\']*\'|[^"\'\\s>]*)/的屬性。我也有一些正則表達式來匹配href屬性激活/<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU的鏈接。但我似乎無法創建一個模式來匹配鏈接標記可能具有的其他組合。

<a id="Anchor_One" name="Anchor_One"> Anchor Details </a> 
<a name="Anchor_Three" > Anchor Three Details </a> 

鏈接沒有href屬性集,沒有拿起我目前的模式,因此可以檢索並非所有的錨。

$regexp = '/<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU'; 
    //parse the page with the provided regular expression 
    if(preg_match_all($regexp, $sessionBlock, $htmlMatches)) 
    { 

    } 
+0

的可能重複[你如何解析和PHP程序的HTML/XML?](http://stackoverflow.com/questions/3577641/how-do-you-parse-and- process-html-xml-in-php) – hakre

+1

**不要使用正則表達式來解析HTML。使用合適的HTML解析模塊**您無法可靠地使用正則表達式解析HTML,並且您將面臨悲傷和挫折。只要HTML從你的期望改變,你的代碼就會被破壞。有關如何使用已經編寫,測試和調試的PHP模塊正確解析HTML的示例,請參閱http://htmlparsing.com/php。 –

回答

3

請注意,請不要使用正則表達式來解析HTML。

HTML不是一種常規的結構化語言,因此用正則表達式解析它非常困難,而且是一個完整的混亂。

看看these alternatives解析PHP中的HTML。

+0

爲了你自己的利益,使用正則表達式作爲最後的手段。我犯了這個錯誤,最終這是一場災難。嘗試DOM擴展。 –

+0

我認爲DOMElement的getAttribute方法能夠提取這些:http://php.net/manual/en/domelement.getattribute.php –

+1

@Killrawr:Dom也適用於HTML解析。您可以關閉警告(內部報告),對於破碎的HTML有一個恢復功能,哪些沒有。我沒有看到你的問題中沒有任何問題無法用DOM完成。 – hakre

1

試試這個"~<a(?=[^>]* name=[\"']([^'\"]*)|)(\s+[^>]*)?>(.*?)</a>~"