2011-03-09 82 views
0

有很多关于何时以及是否适合使用正则表达式来解析html的争论。在HTML解析中可以使用正则表达式吗?

作为一个常见问题出现的是解析链接从HTML我的问题是,如果你正在寻找的是一个HTML块的<a>标签的href值将使用正则表达式适当?在这种情况下,你并不关心结束标签,而你有一个非常具体的结构,你正在寻找。

使用完整的html解析器似乎有点过分。虽然我已经看到问题和答案,表明使用正则表达式来解析URL,但基本安全并不完美,但结构化的<a>标签的额外限制似乎提供了一个环境,其中应该能够达到100%的准确性,而不会出汗。

想法?

回答

4

考虑这个有效 HTML:

<!DOCTYPE html> 
<title>Test Case</title> 
<p> 
<!-- <a href="url1"> --> 
<span class="><a href='url2'>"></span> 
<a href='my">url<'>click</a> 
</p> 

什么是要提取的URL列表?解析器会说只有一个值为my">url<的url。你的正则表达式?

+0

你甚至不必在CDATA及其同类中使用那些令人讨厌的理由来提出一个令人信服的理由,不要在HTML上使用正则表达式。 – Borealid 2011-03-10 01:10:57

+1

html评论是一个很好的例子,但你的古怪的类是我认为无效的HTML。 – Endophage 2011-03-10 05:42:57

+1

@Endophage - 如果您怀疑我的有效性声明,可以在此处查看:http://validator.w3.org/#validate_by_input。只需复制并粘贴示例,然后单击“检查”按钮。 – Alohci 2011-03-10 09:00:51

0

我这个建议之一:

<a.*?href=["'](?<url>.*?)["'].*?>(?<name>.*?)</a> 

在此thread

它最终可能会因什么可以在name

2

我是那种在这种情况下认为使用正则表达式是个坏主意的人之一。

即使你只是想一个href属性从<a>标签相匹配,您正则表达式的表达式会在整个html文档,这使得任何基于正则表达式的解决方案混乱,不安全和臃肿的运行。

另外,使用XML解析器匹配来自标签的href属性几乎没有问题。

我一直在解析HTML页面,每周至少2年。起初,我使用完整的正则表达式解决方案,我认为它比使用HTML解析器更简单更简单。

但我必须回来对我的代码相当多,原因是多方面的:

  • 的源代码已经改变
  • 源页面的
  • 一个打破了HTML和我没有测试它
  • 我没有尝试我的源代码的每一页的代码,只是找出其中的一些没有工作。
  • ...

我发现,固定用长正则表达式模式不完全是最有趣的事情,你必须一次又一次地把你的心了吧。

我通常从现在开始是:用tidy清理html源代码

  • 使用DOM + Xpath实际解析页面并提取我想要的部分。
  • 使用正则表达式只在小纯文本的部件(例如trimed节点的textContent

的代码更健壮,我没有花2小时在很长的正则表达式查找为什么它不适合1%的消息来源,它只是感觉不错。

现在,即使在我不关心结束标签,我有一个非常具体的结构,我仍然使用基于DOM的解决方案,以提高我的技能与DOM库,只是产生更好的代码的情况。

我不喜欢在这里看到的人谁刚刚发表评论,每个HTML +正则表达式“不要在HTML中使用正则表达式”标签的问题,但不提供示例代码什么的开始。

这里是匹配从PHP链接的href属性,只是为了显示使用HTML解析器对于那些常见的任务是不是矫枉过正,在所有的例子。

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

// loop on every links 
foreach($dom->getElementsByTagName('a') as $link) { 
    // get href attribute 
    $href = $link->getAttribute('href'); 
    // do whatever you want with them... 
} 

我希望这有助于某种程度。

+0

感谢您的所有信息。我已经尝试过使用PHP的DOM解析器(我没有选择从PHP更改),以及需要解析然后输出它的速度太慢的情况......它在页面加载超过4秒的区域中添加某处基于正则表达式的解决方案。 – Endophage 2011-03-10 17:28:40