0
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>那就是 inner <div id="lolz2">。可以为 preg_match 保留类似 counter 的东西,这将保持多少<div>'si pass 直到我找到</div>

4

1 回答 1

1

HTML 不是一种常规语言,因此构建类似的东西将是多余的,并且是 HTML 解析器的工作。请参阅:RegEx 匹配除 XHTML 自包含标签以外的开放标签

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

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 解析器,尽管您确实应该处理任何可能嵌套的更复杂的内容(例如,您无法控制输入) .

于 2013-02-17T14:16:19.987 回答