我怎么能有php preg_match的计数器?

时间:2013-02-17 14:12:26

标签: php preg-match

function getContent($xml,$tag,$id="") {
    if ($id=="") {
        $tag_regex = '/<'.$tag.'[^>]*>(.*?)<\/'.$tag.'>/si';
    } else {
        $tag_regex = '/<'.$tag.'[^>]*id=[\'"]'.$id.'[\'"]>(.*?)<\/'.$tag.'>/si';
    }
    preg_match($tag_regex,$xml,$matches);
    return $matches[1];
}

$omg = file_get_contents("Generated/index.php");
$extract = getContent($omg,"div","lolz2");
echo $extract;

例如我有这样的事情。 html里面有这样的东西:

<div id="lolz">qwg1eqwe</div>
<div id="lolz1"><div id='lolz2'>qwdqw2cq</div>asd3qwe</div>

如果我们搜索id lolz,我们会得到正确的答案,但是如果我们搜索lolz1,我们会先停靠</div>内部<div id="lolz2">。对于preg_match,可以保留一些类似于计数器的东西,这样可以保留<div>我经过多少</div>直到找到{{1}}?

1 个答案:

答案 0 :(得分:1)

HTML不是常规语言,因此构建类似的东西会有点过分,并且是HTML解析器的工作。请参阅:RegEx match open tags except XHTML self-contained tags

您的代码失败的原因是因为您在输入中使用了单引号和双引号,但正则表达式没有考虑到它。这对我有用:

function getContent($xml,$tag,$id="") {
    if ($id=="") {
        $tag_regex = '/<'.$tag.'[^>]*>(.*?)<\/'.$tag.'>/si';
    } else {
        $tag_regex = '/<'.$tag.'[^>]*id=[\\\'"]'.$id.'[\\\'"]>(.*?)<\/'.$tag.'>/si';;
    }
    preg_match($tag_regex,$xml,$matches);
    return $matches[1];
}

$omg = '<div id="lolz">qwg1eqwe</div>
<div id="lolz1"><div id="lolz2">qwdqw2cq</div>asd3qwe</div>';
$extract = getContent($omg,"div","lolz2");
var_dump($extract);

只要你没有嵌套元素,这个代码就可以工作,你不需要使用DOM解析器,尽管你真的应该为可能嵌套的更复杂的东西(例如你无法控制输入。)