匹配同一

时间:2015-10-27 23:16:49

标签: php html regex

我该如何使用:

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

并匹配:

<div>Content</div>

我使用了这个正则表达式,但它不起作用,因为它匹配最后一个div

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

2 个答案:

答案 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,则需要进行一些调整,但我想情况并非如此。