使用正则表达式过滤文本中的URL

时间:2016-01-26 06:04:05

标签: regex

所以,我有一个我使用的初始正则表达式过滤器,但我需要更多的选项。这很好,但不够好:

([a-zA-Z0-9]*\@*)((http|https|ftp|ftps)\:\/?\/? ?)?([a-zA-Z0-9\-\.]*)(\.[a-zA-Z]+)(\/\S*)?

我想要实现的是过滤这些字符串:

foo@demo.net    
bar.ba@test.co.uk
www.demo.com    
http://foo.co.uk/
http://demo.com/foo.html?q=bar
http://localhost/

我还想过滤网址中是否有空格,如下所示:

foo@demo.net    
bar.ba@test.co.uk
www. demo .com  
http://foo .co. uk/
http:// demo. com/foo.html?q=bar
http://localhost/

1 个答案:

答案 0 :(得分:0)

如果你不关心它实现了什么语言,Email::FindURI::Find已经存在,可以做你想做的事情。我写了他们。 :)

我以前实现了这个,这是一个非常重要的问题。混合电子邮件和HTML使其更难,我建议你单独进行。我将在下面讨论URI,但它同样适用于电子邮件。

URI::Find使用双通系统。首先,它在文本中找到可能的候选者,然后检查它是否实际上是一个URL。这避免了必须构建完整的URI正则表达式,URI验证器在大多数语言中都可用。不要自己写。

使用the grammar from RFC 3986构建以基本形式串联在一起的正确URI字符集的正则表达式:

URI    = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

例如,scheme

scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

作为正则表达式的[A-Za-z]([A-Za-z0-9+-.])*。等等。

将正则表达式打造成碎片以免你的理智。

使用正则表达式捕获候选者之后,应该通过现有的URI解析器运行它,看看它是否真的是一个URI。

URI::Find has an extensive test suite of false positives and tricky URIs你可能想要研究一下。在RFC本身上运行你的finder也很有用。

URI中的空格几乎不可能处理。这将大大增加误报的数量。

或者,您可以使用Regexp::Common::URI中的正则表达式。它很长,所以I've pasted it here。安装Regexp :: Common后,您也可以使用perl -wle 'use Regexp::Common qw(URI); print $RE{URI}'获取它。