url的正则表达式有问题



我写了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

相关内容

最新更新