用php正则表达式<div class="a">aaaa<div>1111</div>bbbb</div>然后用数组出两个结果aaaabbbb和111 求解
3个回答
展开全部
以下答案来自团队讨论的结果。
最终答案:
<?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多人帮你做这个啊
来自:求助得到的回答
展开全部
楼主提的问题很有深度,呵呵,我们整团的人都在帮你想办法,哈。
下面是我的算法,相对简洁一些吧。测试字符串就取更麻烦的内容了,呵。
<?php
$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>
<div id="test"><div>adf</div><div>afdsf</div><span>span_afdsafasd</span><div>afdsafasd</div></div>';
$rule = '%<\s*?div[^>]*?>((?(?!<div).)*?)<\s*?/div\s*?>%si';
$result = array();
while (preg_match_all($rule,$str,$m)) {
foreach ($m[1] as $k=>$v) {
$result[] = $v;
}
$str=preg_replace($rule,'',$str);
}
print_r($result);
?>
原理:优先取字符串内最底层的div,取完后,把内容置空,递归,直到没有匹配为止。这样的正则连span里的也能出来了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
preg_match_all("/<div\sclass=\"a\">(.+?)<div>(.+?)<\/div>(.+?)<\/div>/", $htmlcontent, $find);
for($i=0; $i<count($find[0]); $i++){
$result[$i][0] = $find[1].$find[3];
$result[$i][1] = $find[2];
}
print_r($result);
for($i=0; $i<count($find[0]); $i++){
$result[$i][0] = $find[1].$find[3];
$result[$i][1] = $find[2];
}
print_r($result);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询