我的正则表达式验证URL是否正确?

Sco*_*ott 1 php regex

我正在研究在PHP中编写与Perl兼容的正则表达式,以检查给定字符串是否是有效的URL.

现在它按预期工作,但我想知道是否有任何预防措施,我应该用来检查它是否安全的用户输入.该$url变量按原样提交,如纯文本一样.

这是整个功能:

private function real_url($url) {
    return preg_match("/(http|https):\/\/(.*?)\.[a-zA-Z]{2,6}/i",$url);
}
Run Code Online (Sandbox Code Playgroud)

我只想要它来检查httphttps.我并不担心ftp,irc等等.只是网页链接.

它还会检查TLD的持续时间.So "google.asdfasdfasdf"将返回falsegoogle.asdf"将返回true.我该如何解决这个问题?".asdf"显然不是有效的TLD.

我只需要知道两件事:

  • 如何检查给定的URL是否真正合法;
  • 是否对原始用户输入是安全的.

Seb*_*olm 5

您应该使用filter_var:

private function real_url($url) {
    return filter_var($url, FILTER_VALIDATE_URL) !== FALSE;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不会验证是否允许该方案(例如http/https),也不会验证顶级域是否存在.

验证域实际有效的最简单方法是进行DNS查找,例如使用checkdnsrr:

private function validate_domain($domain) {
    return checkdnsrr($domain, "A");
}
Run Code Online (Sandbox Code Playgroud)