2011-03-24 32 views
1

我想出了一个正则表达式来抓取2个HTML标签之间的所有文本。这是我到目前为止有:PHP正则表达式点匹配新行替代

<TAG[^>]*>(.*?)</TAG>

在实践中,这应该很好地工作。但在PHP preg_replace中使用选项:/ ims执行它会导致整个字符串匹配。

如果我删除/ s标签,它完美的工作,但标签之间有新行。有没有更好的方法来解决这个问题?

+0

“在实践中,这应该完美地工作。“这正是为什么你不应该使用正则表达式来解析HTML,因为在你尝试实际使用它之前,一切都可以正常工作。改用DOM解析器。 – CanSpice 2011-03-24 18:19:41

+0

您无法可靠地使用正则表达式解析HTML。他们不能胜任这项任务。只要HTML从你的期望改变,你的代码就会被破坏。有关如何使用PHP模块正确解析HTML的示例,请参阅http://htmlparsing.com/php.html。 – 2012-12-21 03:44:45

回答

3

当然有更好的方法。 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` 

您可能需要调整上面的代码(没有经过测试)。

+0

谢谢你。去尝试DOM! – curiousgeorge 2011-03-24 18:47:15

1

我不建议使用正则表达式的完整的HTML匹配,但是,你可以使用 “dottal” 标志: /REGEXP/s的

例子:

$str = "<tag> 
fvox 
</tag>"; 

preg_match_all('/<TAG[^>]*>(.*?)</TAG>/is', $str, $r); 
print_r($r); //dump