2015-10-27 77 views
-1

第一個字符我如何使用這樣的:匹配的相同

<div class="content"><div>Content</div></div> 

和匹配這樣的:

<div>Content</div> 

我用這個正則表達式,但它不工作,因爲它的最後一個div匹配

/<div\s?(.*)>(.*)<\/div>/ 
+3

根據你在做什麼,你不需要正則表達式,並在同一筆記,你**不應該**使用正則表達式來解析HTML:閱讀[本答案](http:// stackoverflow。 com/a/1732454/3296811)瞭解更多信息。考慮使用「DOM」操作。 – Quill

回答

0

正如@Quill說,正則表達式可能不是你最好的選擇,但如果你以某種方式解析HTML字符串的東西,你可以強制噸改變正則表達式,以便它通過編輯(.*)選擇一切到下一個角度托架(僅該div)第一封閉</div>相符:

/<div\s?([^>]*)>([^<]*)<\/div>/ 

我還編輯爲<div>屬性選擇器。

這是最簡單的方法。爲了使它更先進,你可以使用lookahead正則表達式。

0

在這種情況下使用正則表達式進行HTML解析並不合適,因爲您處理遞歸結構。使用DOMDocument

$html = '<div class="content"><div>Content</div></div>'; 

$dom = new DOMDocument('1.0', 'UTF-8'); 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DOMXPath($dom); 
$divs = $xpath->query('//div[@class="content"]'); // Get all DIV tags with "class" attribute with "content" as its value 

foreach($divs as $div) { 

    foreach ($div->childNodes as $childNode) { 
     echo $dom->saveHTML($childNode); 
    } 
} 

IDEONE demo

結果:<div>Content</div>

您將需要一些調整,如果輸入包含無效的HTML,但我想它是不是這樣的。