首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过正则表达式和filter_val验证URL

问通过正则表达式和filter_val验证URL
EN

Stack Overflow用户
提问于 2011-06-03 04:44:38
回答 1查看 1.3K关注 0票数 0

我一直在寻找在php中验证网址的最佳方法,并决定同时使用正则表达式和filter_val()。我想分享我的代码并获得一些反馈。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-03 04:52:24

您在regex中犯了一些错误。没有什么致命的,我不认为,但尽管如此,只是一些杂七杂八的事情,你可以做一些清理。你已经把http放在了括号里,它们不需要出现在那里。看起来您并没有捕获它以供以后使用。如果您尝试将http://部分设置为可选,则需要使用(?:http:\/\/)?而不是。此外,请注意,您需要转义字符串中的反斜杠。这是否也能起作用呢?

代码语言:javascript
复制
$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。

这有点低效:

代码语言:javascript
复制
if(!filter_var($str, FILTER_VALIDATE_URL) || (!preg_match($regex, $str))) //if invalid URL
{               
    return FALSE;
}
else 
{
    return TRUE;
}

您的表达式将产生true/false值。如果需要的话,直接返回它,如果需要的话,否定它怎么样?

代码语言:javascript
复制
return !(!filter_var($str, FILTER_VALIDATE_URL) || !preg_match($regex, $str));

另外,请注意以下表达式是等效的:

代码语言:javascript
复制
!(!A || !B)
   A &&  B

因此,这可以进一步简化为:

代码语言:javascript
复制
return filter_var($str, FILTER_VALIDATE_URL) && preg_match($regex, $str);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6220174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档