我写了regex来验证url,它对大多数url都很好,对于下面的url它不起作用:
我的正则表达式:
/^(https?://)?([da-z.-]+).([a-z.]{2,6})([?=/w .-]*)/?$/
https://www.facebook.com/permalink.php?story_fbid=802451379821615&id=298161773583914&pnref=故事
如何使其适用于所有URL
我的理解是,满足每一个可能的有效URL都会导致严重的头痛。然而,基于此资源,有一个非常简单的正则表达式可以处理大多数边缘情况。
试试@stephenhay的这个,它无论如何都适用于你的例子:
^(https?|ftp)://[^s/$.?#].[^s]*$
您的regex必须处理以下带有ipv6、utf8字符的情况。。。
ipv4
http://192.168.1.1/test.htm
ipv6
http://[2a00:1450:4007:806::1007]/!voilà
国际字符
http://bébé.fr/
事实上,有很多复杂的可能性,所以更好的方法是测试协议和主机名:
if (preg_match("#^(https?)://([^/]+)/#", $url, $out)) {
if (gethostbyname($out[2])) {
return 1;
}
}
return 0;
或者,一个更简单的解决方案是不使用正则表达式,而是使用处理所有情况的PHP parse_url()
函数。
只使用编写REGEX是没有意义的
filter_var($url, FILTER_VALIDATE_URL);
将值验证为URL(根据»http://www.faqs.org/rfcs/rfc2396),可以选择所需的组件。请注意,有效的URL可能没有指定HTTP协议HTTP://,因此可能需要进一步验证才能确定URL使用了预期的协议,例如ssh://或mailto:。请注意,该函数只会找到有效的ASCII URL;国际化域名(包含非ASCII字符)将失败。
对于JavaScript检查
https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/uri.js