我一直在寻找在php中验证网址的最佳方法,并决定同时使用正则表达式和filter_val()。我想分享我的代码并获得一些反馈。
function _valid_urls($str) {
$regex = "/^(http):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i";
if(!filter_var($str, FILTER_VALIDATE_URL) || (!preg_match($regex, $str))) //if invalid URL
{
return FALSE;
}
else
{
return TRUE;
}
} 代码可以工作,但我不能完全确定它是否安全。
编辑:
我发现最有效的网站URL正则表达式是/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \?=.-]*)*\/?$/
http://www.catswhocode.com/blog/10-regular-expressions-for-efficient-web-development
发布于 2011-06-03 04:52:24
您在regex中犯了一些错误。没有什么致命的,我不认为,但尽管如此,只是一些杂七杂八的事情,你可以做一些清理。你已经把http放在了括号里,它们不需要出现在那里。看起来您并没有捕获它以供以后使用。如果您尝试将http://部分设置为可选,则需要使用(?:http:\/\/)?而不是。此外,请注意,您需要转义字符串中的反斜杠。这是否也能起作用呢?
$regex = "/^".
"(?:http:\\/\\/)?". // Look for http://, but make it optional.
"(?:[A-Z0-9][A-Z0-9_-]*(?:\\.[A-Z0-9][A-Z0-9_-]*))". // Server name
"(?:\\d+)?". // Optional port number
"(?:\\/\\.*)?/i"; // Optional training forward slash and page info可能有更好的正则表达式用于匹配URL。我建议你在谷歌上搜索regex url,看看它们。如果没有必要,不要重复发明轮子!还请注意,上面不允许没有顶级域的URL,例如http://localhost/mypage.html。如果您在"Server name“行的双引号前加了一个问号,则应该允许使用非tld。
这有点低效:
if(!filter_var($str, FILTER_VALIDATE_URL) || (!preg_match($regex, $str))) //if invalid URL
{
return FALSE;
}
else
{
return TRUE;
}您的表达式将产生true/false值。如果需要的话,直接返回它,如果需要的话,否定它怎么样?
return !(!filter_var($str, FILTER_VALIDATE_URL) || !preg_match($regex, $str));另外,请注意以下表达式是等效的:
!(!A || !B)
A && B因此,这可以进一步简化为:
return filter_var($str, FILTER_VALIDATE_URL) && preg_match($regex, $str);https://stackoverflow.com/questions/6220174
复制相似问题