用PHP和Regex提取最外层Div的内容

vzgqcmou  于 5个月前  发布在  PHP
关注(0)|答案(3)|浏览(41)

我试图用PHP提取div的内容,独立于类名和其他参数。
我需要的是,我有多行,单行,多参数div,如

<div class="my-class additional-class"><div class="my-class2">
<div class="my-class"></div>
</div>

</div>

字符串
我想得到第一个div的所有内容,不包括第一个div。

<div class="my-class2">
<div class="my-class"></div>
</div>


一般来说,我猜

<div.*>(.*)<\/div>/mU


应该会起作用的,但我不知道为什么没有。
我遇到了this one

(?s)(?<=<div\sclass="test">\n).*(?=<\/div>)


它可以用一个类名test来工作,但是我不能让它像

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

v7pvogib

v7pvogib1#

下面是一个使用DOM解析器获取它的方法:

<?php
$html = '<div class="my-class additional-class"><div class="my-class2">
<div class="my-class"></div>
</div>
</div>';

$doc = new DOMDocument();
$doc->loadHTML($html); // loads your html
$elems = $doc->getElementsByTagName('div'); // find all div elements
$outerdiv = $elems->item(0); // outermost div
echo $outerdiv->childNodes[0]->C14N() . "\n"; // print inner HTML

/*
<div class="my-class2">
<div class="my-class"></div>
</div>
*/
?>

字符串
如果你真的需要正则表达式解决方案,那么用途:

~<div[^>]*>(.*)</div>~is


抓住第一组俘虏

af7jpaap

af7jpaap2#

而不是.*,你应该使用[\s\S]*来匹配每个字符,包括新行。
下面是一个工作示例:

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

字符串
参见test case
另外,如果你希望标签必须是平衡的,你可以用递归(?R)来尝试:

<div.*?>((?:(?!<\/?div)[\s\S]|(?R))*)<\/div>


看到test case,注意它与最后一个</div>不匹配,因为它没有对应的开始标记。

wztqucjr

wztqucjr3#

也许你应该使用非贪婪的解决方案:

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

字符串

相关问题