正则表达式,URL有效性问题

时间:2010-08-06 15:18:00

标签: regex

示例链接
https://stackoverflow.com/questions/ 标记 / ruby​​
true url

https://stackoverflow.com/questions/ @#dsd / javascript
false url

我如何仅检查/ tags / part的有效性而不是整个网址

任何帮助我的人 有人给我这个网址部分的正则表达式。

我如何根据我的情况验证我的网址

由于

2 个答案:

答案 0 :(得分:1)

整个网址:

function isValidURL($url) {
    return preg_match('^(https?|ftp)\:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?\$', $url);
}

Unix文件夹名称(基本上是/之间的任何内容):

function isValidPath($url) {
    return preg_match('(\/([a-z0-9+\$_-]\.?)+)*\/?', $url);
}

答案 1 :(得分:1)

danyim的答案是准确的,尽管它可能不完全符合您的需求,如评论中所述。此外,他的解决方案是基于PHP的。从扫描你的标签参与,我猜你实际上更喜欢一个javascript解决方案(所以我会提供两个!)。

首先,重构他的php:

function isValidURL($url) {
    $regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass 
    $regex .= "((([a-z][a-z0-9-.]*)\.([a-z]{2,3}))|(([12]?[0-9]?[0-9]\.){4}))"; // Host or IP 
    $regex .= "(\:[0-9]{2,5})?"; // Port 
    $regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
    $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
    $regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 
    return preg_match($regex, lcase($url));
}

请注意,我在检查url之前修改了return以执行lcase操作。您还可以在正则表达式上使用不区分大小写的标志来防止对此进行此操作。如上所述,有许多部分对您的用例可能有效,也可能无效。具体来说,您可能没有想要接受包含用户名/密码或来自静态IP的URL的情况。您可以通过删除相关行来修改正则表达式以排除匹配的任何部分永远无效。此外,这是//Host or IP行的第二个选项,仅使其成为主持人:

    $regex .= "([a-z][a-z0-9-.]*)\.([a-z]{2,3})"; // Host only 

现在在javascript中同样的东西(结合在一起,因为js处理正则表达式不同于字符串...调整将更容易在PHP版本中进行,然后模仿到这里):

function isValidURL(url) {
   var regex = /((https?|ftp)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?((([a-z][a-z0-9-.]*)\.([a-z]{2,3}))|(([12]?[0-9]?[0-9]\.){4}))(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/i
   return (url.match(regex));
}