用php正则表达式<div class="a">aaaa<div>1111</div>bbbb</div>然后用数组出两个结果aaaabbbb和111 求解

 我来答
百度网友a19d193
2013-05-23 · TA获得超过3446个赞
知道大有可为答主
回答量:1464
采纳率:100%
帮助的人:1440万
展开全部

以下答案来自团队讨论的结果。

 最终答案:

<?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多人帮你做这个啊

来自:求助得到的回答
zomew
2013-05-23 · 超过63用户采纳过TA的回答
知道小有建树答主
回答量:113
采纳率:0%
帮助的人:127万
展开全部

楼主提的问题很有深度,呵呵,我们整团的人都在帮你想办法,哈。


下面是我的算法,相对简洁一些吧。测试字符串就取更麻烦的内容了,呵。


<?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里的也能出来了。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
novice_pegasus
2013-05-23 · TA获得超过624个赞
知道小有建树答主
回答量:722
采纳率:100%
帮助的人:646万
展开全部
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);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式