以下答案来自团队讨论的结果。
最终答案:
<?php
/**
* 模式修饰符s,可使得.能匹配包括换行在内的任意字符
* 模式修饰符i,不区分大小写匹配
* (?!<div.*?>.*<div.*?</div>) 负向预查排除<div中间还带<div的情况
* <div.*?>(.*?)</div> 每次匹配一个中间不含<div的字符串
*/
$str = '<div class="a">aaaa<div>
1111</div><div>
2222<div>3333
</div></div>bbbb</div>';
$str = '<div class="a">1111<div>2222</div>3333</div><div class="a">4444<div>5555</div>6666</div><div class="a">7777<div>8888</div><div>9999</div>aaaa</div>';
$str = '<div class="a">aaaa<div>1111</div><div><span>2222</span></div>bbbb</div>';
$results = array();
while(preg_match('#(?!<div.*?>.*<div.*?</div>)<div.*?>(.*?)</div>#si',$str,$match,PREG_OFFSET_CAPTURE)){ //对中间不存在<div的字符串进行匹配,记录偏移量
$start = $match[0][1]; //$match[0][1] 为匹配字符的起始
$end = $match[0][1]+strlen($match[0][0]); //匹配字符的起始($match[0][1])加上其长度(strlen($match[0][0]))
$str = substr($str,0,$start) . substr($str,$end); //原来$str为 substr($str,0,$start) . $match[0][0] . substr($str,$end);现在去掉中间部分。
$results[] = $match[1][0]; //$match[1][0] 小括号匹配部分
}
echo '<pre>';
print_r($results); //匹配结果为逆序的
krsort($results); //倒序排序一下
print_r($results); //顺序结果
//End_php
Zjmainstay(951086941) 10:55:13
逐个往上注释$str可以看到多个匹配情况结果
赶紧采纳吧,N多人帮你做这个啊
来自:求助得到的回答