所以,我有一个我使用的初始正则表达式过滤器,但我需要更多的选项。这很好,但不够好:
([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/
答案 0 :(得分:0)
如果你不关心它实现了什么语言,Email::Find和URI::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}'
获取它。