修改正则表达式也匹配IP地址

时间:2014-11-27 03:04:56

标签: regex validation

我目前使用this regular expression来验证网址:

^([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?([a-z0-9-.]*)\.([a-z]{2,4})(\:0*(?:6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]))?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?$

它匹配相当长的网址列表:

google.com
google.com#a1
google.com?abc=123
google.com:80
google.com:80#a1
google.com:80?abc=123
google.com:80/test
google.com:80/test#a1
google.com:80/test?abc=123
google.com:80/test?abc=123#a1
www.google.com
www.google.com#a1
www.google.com?abc=123
www.google.com:80
www.google.com:80#a1
www.google.com:80?abc=123
www.google.com:80/test
www.google.com:80/test#a1
www.google.com:80/test?abc=123
www.google.com:80/test?abc=123#a1
www.www.google.com
www.www.google.com#a1
www.www.google.com?abc=123
www.www.google.com:80
www.www.google.com:80#a1
www.www.google.com:80?abc=123
www.www.google.com:80/test
www.www.google.com:80/test#a1
www.www.google.com:80/test?abc=123
www.www.google.com:80/test?abc=123#a1
john:smith@google.com
john:smith@google.com#a1
john:smith@google.com?abc=123
john:smith@google.com:80
john:smith@google.com:80#a1
john:smith@google.com:80?abc=123
john:smith@google.com:80/test
john:smith@google.com:80/test#a1
john:smith@google.com:80/test?abc=123
john:smith@google.com:80/test?abc=123#a1
john:smith@www.google.com
john:smith@www.google.com#a1
john:smith@www.google.com?abc=123
john:smith@www.google.com:80
john:smith@www.google.com:80#a1
john:smith@www.google.com:80?abc=123
john:smith@www.google.com:80/test
john:smith@www.google.com:80/test#a1
john:smith@www.google.com:80/test?abc=123
john:smith@www.google.com:80/test?abc=123#a1
john:smith@www.www.google.com
john:smith@www.www.google.com#a1
john:smith@www.www.google.com?abc=123
john:smith@www.www.google.com:80
john:smith@www.www.google.com:80#a1
john:smith@www.www.google.com:80?abc=123
john:smith@www.www.google.com:80/test
john:smith@www.www.google.com:80/test#a1
john:smith@www.www.google.com:80/test?abc=123
john:smith@www.www.google.com:80/test?abc=123#a1

但是,根据我的知识,它与这些URL也不相符:

8.8.8.8
8.8.8.8#a1
8.8.8.8?abc=123
8.8.8.8:80
8.8.8.8:80#a1
8.8.8.8:80?abc=123
8.8.8.8:80/test
8.8.8.8:80/test#a1
8.8.8.8:80/test?abc=123
8.8.8.8:80/test?abc=123#a1
john:smith@8.8.8.8
john:smith@8.8.8.8#a1
john:smith@8.8.8.8?abc=123
john:smith@8.8.8.8:80
john:smith@8.8.8.8:80#a1
john:smith@8.8.8.8:80?abc=123
john:smith@8.8.8.8:80/test
john:smith@8.8.8.8:80/test#a1
john:smith@8.8.8.8:80/test?abc=123
john:smith@8.8.8.8:80/test?abc=123#a1

作为参考,我发现这个IP地址似乎运行良好:

^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

如何将它们绑在一起?或者,是否有更好的正则表达式匹配所有URL?

演示:

http://rubular.com/r/ufuNkHqX5G

2 个答案:

答案 0 :(得分:1)

您可以通过执行(?:<regex1>|<regex2>)将两个正则表达式组合在一起,这意味着匹配 regex1 regex2 。 (?:表示添加的括号不会捕获)。

您可以在线找到各种用于URL验证的正则表达式,例如In search of the perfect URL validation regex列出了不少。

答案 1 :(得分:0)

验证电子邮件地址比验证网页网址要复杂一些。事实上, 确定正确的正则表达式来验证电子邮件地址似乎是一个没有明确正确答案的问题;见Using a regular expression to validate an email address

如果您使用PHP,则不限于使用正则表达式来验证电子邮件地址和URL,如下面的代码所示:

<?php
$url = "http://8.8.8.8";
$mess = (!filter_var($url, FILTER_VALIDATE_URL))? "invalid" : "valid";
echo $mess, ": $url\n";

$email = "me@he re.com";
$mess = (!filter_var($email, FILTER_VALIDATE_EMAIL))? "invalid" :"valid";
echo $mess, ": $email\n";