我想捕获一个字符串中<div></div>里的内容,用了这样一个正则式:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div> 这个正则式我用工具测试过了,没有问题。但是当我放到php程序里面后:
$reg = "<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>";
preg_match_all($reg,$data,$result);就报错了:Unknown modifier ']'
请问这是什么原因?
$reg = "<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>";
preg_match_all($reg,$data,$result);就报错了:Unknown modifier ']'
请问这是什么原因?
/<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'<\/div>)[^<>]*)+)*(?(Open)(?!))<\/div>/i
这样后仍然报错:Compilation failed: syntax error in subpattern name (missing terminator)
有意思的请参考:php正则取嵌套html标签(http://blog.csdn.net/iseagold/archive/2010/04/14/5484904.aspx)
<div class="content"><h1 class="hello">hello</h1><a id="index" href="index.php"><img class="img" src="1.jpg" /></a></div><div id="test"><span class="title"><strong>Strong Text</strong></span></div><a id="index" href="index.php"><img class="img" src="1.jpg" /></a><span class="title"><strong>Strong Text</strong></span> 将id或者class的值看做一个变量,任意匹配符合正则式的那一组标签的内容,也就是说,以上3段代码符合的正则式,除了class="content",id="index",class="title"以外,其余的部分都是相同的,这三个不同的地方在php程序中传入相应变量即可。多谢!
/<\s*[a-z][0-z]*[^>]*[^\/]>(([^<>]*)|(<\s*[a-z][0-z]*[^>]*\/>)|(?R))*<\/[a-z][0-z]*>/但是第一个标签总是匹配不到比如:<div class="test1">
<div class="test2">
<span>alk</span>
<img src="d.jpg"/>
<div class="test3">
<strong>dkk<br/></strong>
</div>
<a href="lk.php">
<h1>dklk</h1>
</a>
</div>
<div class="c">lkj</div>
</div>
匹配的结果是:
array(1) {
[0]=>
string(173) "<div class="test2"><span>alk</span><img src="d.jpg"/><div class="test3"><strong>dkk<br/></strong></div><a href="lk.php"><h1>dklk</h1></a></div><div class="c">lkj</div></div>"
}
<div class="a">
<h1 class="hello">hello</h1>
<a id="index" href="index.php">
<img class="img" src="1.jpg" />
</a>
</div>
<div id="test">
<span class="title">
<strong>Strong Text</strong>
</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 getMatchTags($s, $arr) {
$sMatchClose = '';
$arrClose = array();
$arrReturn = array();
for($i=0; $i<count($arr); $i++) {
$iCount = 0;
if (preg_match("/<[^>\s*]*/", $arr[$i][0], $aMatchOpen)) {
$sMatchClose = '</' . substr($aMatchOpen[0], 1) . '>';
for($j=$i; $j<count($arr); $j++) {
if (!(stripos($arr[$j][0], $aMatchOpen[0]) === false)) { $iCount ++;
$flag = 1;
}
if (!(stripos($arr[$j][0], $sMatchClose) === false)) { $iCount --;
$flag = 1;
if($iCount == 0 && $flag == 1) {
$arrClose[] = $arr[$i];
$arrClose[] = $arr[$j];
}
}
}
}
}
$k=0;
for($i=0; $i<count($arrClose); $i+=2) {
$arrReturn[$k][0] = $arrClose[$i];
$arrReturn[$k][1] = $arrClose[$i+1];
$arrReturn[$k][2] = substr($s, $arrClose[$i][1], $arrClose[$i+1][1]+strlen($arrClose[$i+1][0])-$arrClose[$i][1]);
$k++;
}
return $arrReturn;
}
print_r(getMatchTags($s, $aMatches[0]));