PHP-php 用正则表达式 如何匹配成对的html标签?

PHP-php 用正则表达式 如何匹配成对的html标签?

夜无邪 发布于 2017-08-20 字数 440 浏览 1244 回复 3

例如从下边字符串中匹配 id 为 test 的div

    <div id="test1">.....</div>
<div id="test">
<div class="font">xxx</div>
<div>xxx</div>
<span>aaa</span>
.............
</div>
<div>
<span>contents</span>
</div>
.......

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

虐人心 2017-10-26 3 楼

如果需要取得的数据仅是如题,可以尝试先取得

 <div id="test">
<div class="font">xxx</div>
<div>xxx</div>
<span>aaa</span>
.............
</div><div>
<span>contents

然后,再去掉
<div>
<span>contents

归属感 2017-10-03 2 楼

测试通过:

<?php
$str = '<div id="test"><div>adf</div><div>afdsf</div><span>afdsafasd</span><div>afdsafasd</div></div>';
$regex = "/(<div.*?id="test".*?><.*?>.*?</.*?></div>)/ism";
preg_match_all ( $regex, $str, $m );
print_r($m[1]);
?>

结果为:

Array
(
[0] => <div id="test"><div>adf</div><div>afdsf</div><span>afdsafasd</span> <div>afdsafasd</div></div>
)

想挽留 2017-08-20 1 楼

php纯正则很难实现这样复杂的匹配,必须做些逻辑处理,一下是正则加逻辑处理:

<?php
$s = <<<html
<div id="test1">.....</div>
<div id="test">
<div class="font">xxx</div>
<div>xxx</div>
<span>aaa</span>
</div>
<div>
<span>contents</span>
</div>
html;
$pattern = "/(".
"<!w+(?:s+[^>]*?)+s*>|".
"<w+(?:s+w+(?:s*=s*(?:"[^"]*"|'[^']*'|[^"'>s]+))?)*s*/?>|".
"</w+s*>|".
"<!--[^-]*-->".
")/";

preg_match_all($pattern, $s, $aMatches, PREG_OFFSET_CAPTURE);
function getNested($strHTML, $str, $arr) {

$i=0;
$j=0;
$h=0;
$arrStr = array();
$arrBak = $arr;
$arrNested1 = array();
$arrNested2 = array();
foreach($arr as $k=>$v) {

if(trim($v[0]) == $str) {

$arrStr[0] = $v[0];
$arrStr[1] = $v[1];
$arrStr[2] = $k;
}
}

for($i=$arrStr[2]; $i<count($arrBak); $i++) {

if (preg_match('/<div/', $arrBak[$i][0])) {

$j++;
$arrNested1[$j][] = $arrBak[$i];
}
if (preg_match('/</div>/', $arrBak[$i][0])) {

$h++;
$arrNested2[$h][] = $arrBak[$i];
}
}

return substr($strHTML, strlen($str), $arrNested2[$j][0][1]-$arrStr[1]-strlen($str));
}

echo getNested($s, '<div id="test">', $aMatches[0]);
?>