我想出了一个正则表达式来抓取2个HTML标签之间的所有文本。这是我到目前为止有:PHP正则表达式点匹配新行替代
<TAG[^>]*>(.*?)</TAG>
在实践中,这应该很好地工作。但在PHP preg_replace中使用选项:/ ims执行它会导致整个字符串匹配。
如果我删除/ s标签,它完美的工作,但标签之间有新行。有没有更好的方法来解决这个问题?
我想出了一个正则表达式来抓取2个HTML标签之间的所有文本。这是我到目前为止有:PHP正则表达式点匹配新行替代
<TAG[^>]*>(.*?)</TAG>
在实践中,这应该很好地工作。但在PHP preg_replace中使用选项:/ ims执行它会导致整个字符串匹配。
如果我删除/ s标签,它完美的工作,但标签之间有新行。有没有更好的方法来解决这个问题?
当然有更好的方法。 Don't parse HTML with regex。
DOMDocument应该能够更好地适应你:
$dom = new DOMDocument();
$dom->loadHTMLFile('filename.html');
$tags = $dom->getElementsByTagName('tag');
echo $tags[0]->textContent; // Contents of `tag`
您可能需要调整上面的代码(没有经过测试)。
谢谢你。去尝试DOM! – curiousgeorge 2011-03-24 18:47:15
我不建议使用正则表达式的完整的HTML匹配,但是,你可以使用 “dottal” 标志: /REGEXP/s的
例子:
$str = "<tag>
fvox
</tag>";
preg_match_all('/<TAG[^>]*>(.*?)</TAG>/is', $str, $r);
print_r($r); //dump
“在实践中,这应该完美地工作。“这正是为什么你不应该使用正则表达式来解析HTML,因为在你尝试实际使用它之前,一切都可以正常工作。改用DOM解析器。 – CanSpice 2011-03-24 18:19:41
您无法可靠地使用正则表达式解析HTML。他们不能胜任这项任务。只要HTML从你的期望改变,你的代码就会被破坏。有关如何使用PHP模块正确解析HTML的示例,请参阅http://htmlparsing.com/php.html。 – 2012-12-21 03:44:45