改进正则表达式模式以验证ipv6 / punycode /外部域名

时间:2012-10-09 16:44:50

标签: php regex ipv6 punycode

  

可能重复:
  PHP validation/regex for URL
  How to validate a domain name using Regex & Php?

我目前使用此正则表达式模式在域名添加到我的数据库之前验证域名:

$pattern = '/^https?:\/\/([a-zA-Z0-9_\-]+:[^\s@:]+@)?((([a-zA-Z][a-zA-Z0-9\-]+\.)+[a-zA-Z\-]+)|((2(5[0-5]|[0-4][0-9])|[01][0-9]{2}|[0-9]{1,2})\.(2(5[0-5]|[0-4][0-9])|[01][0-9]{2}|[0-9]{1,2})\.(2(5[0-5]|[0-4][0-9])|[01][0-9]{2}|[0-9]{1,2})\.(2(5[0-5]|[0-4][0-9])|[01][0-9]{2}|[0-9]{1,2})))(:[0-9]{1,5})?(\/[!~*\'\(\)a-zA-Z0-9;\/\\\?:\@&=\+\$,%#\._-]*)*$/';

这个模式允许子域,ipv4字符串等。因为这是一个目录,它不允许通常有效的字符串,例如http://localhost,但无论如何,我需要添加的内容将支持ipv6 IP字符串以及国际域名,例如müller.com

我目前使用:

$url = "http://müller.com/"
if(preg_match($pattern,$url)) {
echo "valid";
} else {
echo "invalid";
}

它验证了我想要验证的所有内容,除了ipv6地址和外来字符。

我想知道是否有人能够提出这两个补充,因为它真的会让我的一天。请注意,我对PHP非常陌生,所以请不要向我扔东西。相反,如果你能告诉我一个有效的例子并解释你所添加的内容,那将会更有用。

可能需要在检查之前将外来东西转换为有效的punycode URL,然后再允许使用punycode。我愿意接受建议。

非常感谢 - 非常感谢您的帮助

编辑:我怀疑这个问题是重复的,因为我不是在寻找类似的解决方案,加上现有的解决方案都没有用。 FILTER_VALIDATE_URL不起作用,因为它将允许我不想允许的字符串和其他解决方案也使我的正则表达式模式无用。

我正在寻找的是我所拥有的,但另外支持ipv6 IP字符串和punycode名称/国际名称。

0 个答案:

没有答案