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}}?
答案 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解析器,尽管你真的应该为可能嵌套的更复杂的东西(例如你无法控制输入。)