【问题标题】:Validate URL by regex and filter_val通过正则表达式和 filter_val 验证 URL
【发布时间】:2011-06-02 20:44:37
【问题描述】:

我一直在寻找在 php 中验证 URL 的最佳方法,并决定同时使用正则表达式和 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

【问题讨论】:

  • 您的正则表达式不太正确,但比 _VALIDATE_URL 更严格。但为什么你认为你需要两者?
  • 取决于您对“有效 URL”的定义。 https 怎么样? http://localhost 或类似的怎么样?这是一个有效的 URL,但它未能通过您的验证。但是http://10.0.0.1.com 通过了...

标签: php regex security validation url


【解决方案1】:

您在正则表达式中犯了一些错误。没有什么致命的,我不认为,但尽管如此,你可以做一些杂事来清理它。您在 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。如果您在“服务器名称”行的双引号前加上问号,则应该允许非 tld 网址。

这个效率有点低:

if(!filter_var($str, FILTER_VALIDATE_URL) || (!preg_match($regex, $str))) //if invalid URL
{               
    return FALSE;
}
else 
{
    return TRUE;
}

您的表达式将产生一个真/假值。如果需要,直接返回,否定如何?

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);

【讨论】:

  • 这有点复杂。 return filter_var($str, FILTER_VALIDATE_URL) && preg_match($regex, $str)
  • 你是对的,我知道我在简化该表达式时遗漏了一些明显的东西。我会更新我的答案。
  • 谢谢!很好的解释!
猜你喜欢
  • 2012-01-08
  • 2021-02-24
  • 1970-01-01
  • 2012-03-07
  • 2015-04-20
  • 2015-09-07
  • 2013-08-24
相关资源
最近更新 更多