2017-04-05 91 views
-1

比方說,有兩個默認的HTML電子郵件標籤:正則表達式,以確保電子郵件地址

<a href="mailto:[email protected]">[email protected]</a> 
<a href="mailto:[email protected]" nosecure>[email protected]</a> 

我只想要查找的電子郵件標記沒有nosecure標籤在PHP。所以像\<a\b(?![^>]*\bnosecure\b)[^>]*>[^<]*<\/a>這樣的東西到目前爲止將做到這一點。
但是現在我想爲href標記的值和用於<a>...</a>標記內的文本的值組設置一個組。第二組很容易:

\<a\b(?![^>]*\bnosecure\b)[^>]*>([^<]*)<\/a> 

但是,如何獲得第一組?在href標記之前/之前可以有無限制的其他字符,而且nosecure可以在href標記之前/之前。
如何獲取href="mailto:<group>"的值的正則表達式組。此外,可以有'而不是"

測試用例和我目前的嘗試:https://regex101.com/r/RNEZO3/2

感謝所有幫助:)
問候

+1

關於用正則表達式解析XML/HTML的困難的另一個問題......呃。 –

回答

1

Never使用正則表達式解析HTML。始終使用a DOM parser!這比你想象的容易,只需要學習一點XPath到find the attribute(或缺乏)和文本內容。

<?php 
$html = <<< HTML 
<div> 
<a href="mailto:[email protected]">[email protected]</a> 
<a href="mailto:[email protected]" nosecure>[email protected]</a> 
</div> 
HTML; 
$dom = new DomDocument(); 
$dom->loadHTML($html); 
$xpath = new DomXPath($dom); 

/* href attribute */ 
$result = $xpath->query("//a[not(@nosecure)]/@href"); 
foreach ($result as $node) { 
    echo str_replace("mailto:", "", $node->value); 
} 

/* text content */ 
$result = $xpath->query("//a[not(@nosecure)]/text()"); 
foreach ($result as $node) { 
    echo $node->textContent; 
} 
+0

好吧,從來沒有聽說過這個,但非常感謝,我會看看它,並嘗試學習它。但是有一個問題剛剛開始:外部處理似乎是可能的,但是我可以直接用'str_replace'在原始字符串中操作結果嗎?所以我在你的例子的最後得到了一個改變的'$ html'而不是獨立的輸出? – christopher2007

+1

是的,你可以。您可以編輯'$ node'的內容,然後在完成後使用'$ dom-> saveHTML()'輸出新文檔。 – miken32

+0

要編輯'$ node'是屬性時,使用'$ node-> value',當它是文本節點時,使用'$ node-> textContent'。 – miken32

相關問題