2016-04-06 80 views
0

我想從html或xml文件中提取未註釋掉的所有節點。 以下正則表達式是我的正確方法。正則表達式:找到所有未註釋的標籤

我正則表達式

/<span.*?>([\s\S]*?)<\/span>/gi 

下面的示例XML

<div> 
<p> 
    <span style="font-size: 20px;">Hello</span> 
    <span style="font-size: 20px;">World</span> 
</p> 
<p> 
    <!-- 
    <span>Hello</span> 
    <span>World</span> 
    --> 
</p> 
<p> 
    <span>Hello</span> 
    <span>World</span> 
</p> 
<!-- 
<p> 
    <span>Hello</span> 
    <span>World</span> 
</p> 
--> 

我將不勝感激幫助。

最好的問候, 邁克爾

+2

正則表達式是錯誤的工具。使用真正的XML或HTML解析器。 – kjhughes

+0

先刪除評論,然後使用你的方法。 –

+0

你應該*永遠不*用正則表達式解析HTML。改爲使用[PHP DOM解析器](http://simplehtmldom.sourceforge.net/)。 –

回答

0

好,則可以取消(在這種情況下DomDocument)一個體面的解析器意見,隨後將分析剩餘部分。考慮下面的代碼(介意改變號碼,方便您Hello World字符串,使除去所清楚是什麼):

<?php 

$html = '<div> 
<p> 
    <span style="font-size: 20px;">Hello</span> 
    <span style="font-size: 20px;">World</span> 
</p> 
<p> 
    <!-- 
    <span>Hello2</span> 
    <span>World2</span> 
    --> 
</p> 
<p> 
    <span>Hello3</span> 
    <span>World3</span> 
</p> 
<!-- 
<p> 
    <span>Hello4</span> 
    <span>World4</span> 
</p> 
--> 
</div> 
'; 

$dom = new DOMDocument; 
$dom->loadHtml($html); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//comment()') as $comment) 
    $comment->parentNode->removeChild($comment); 
$body = $xpath->query('//body')->item(0); 
echo $dom->saveXml($body); 
# yields hello world and hello world3 
?> 

現在您的評論標籤已被刪除。很明顯,你可以用xpath來更精確。

+0

謝謝,我首先我提取所有評論和標籤,並用第二個正則表達式過濾掉所有評論。 \ S] *?跨度>)/ GI –