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

如题所述

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

 最终答案:

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

来自:求助得到的回答
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-23

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


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


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

本回答被提问者采纳
第2个回答  2013-05-23
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);
相似回答