我正在研究在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)
我只想要它来检查http和https.我并不担心ftp,irc等等.只是网页链接.
它还会检查TLD的持续时间.So "google.asdfasdfasdf"将返回false但google.asdf"将返回true.我该如何解决这个问题?".asdf"显然不是有效的TLD.
我只需要知道两件事:
您应该使用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)