我该如何使用:
<div class="content"><div>Content</div></div>
并匹配:
<div>Content</div>
我使用了这个正则表达式,但它不起作用,因为它匹配最后一个div
/<div\s?(.*)>(.*)<\/div>/
答案 0 :(得分:0)
正如@Quill所说,正则表达式对你来说可能不是最好的选择,但是如果你以某种方式解析某个HTML字符串,你可以通过编辑来改变正则表达式,使其与第一个结束</div>
匹配(.*)
选择到下一个尖括号的所有内容(仅限div):
/<div\s?([^>]*)>([^<]*)<\/div>/
我还编辑了<div>
属性的选择器。
这是最简单的方法。为了使它更高级,你可以使用超前正则表达式。
答案 1 :(得分: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,则需要进行一些调整,但我想情况并非如此。