检查字符串是否为有效URL的最佳正则表达式是什么?

1038

如何检查给定的字符串是否是有效的URL地址?

我对正则表达式的了解很基础,并不能让我从已经在网上看到的成百上千个正则表达式中进行选择。


45
只翻译内容:任何URL还是只有HTTP?例如,mailto:me@example.com算作URL吗?还是像AIM聊天链接这样的也算? - Mecki
6
如果一个URL没有以“http(等等)”开头,你怎么能把它与其他任意带有点的字符串区分开来?比如“MyClass.MyProperty.MyMethod”或者“I sometimes miss the spacebar. Is this a problem?” - Tomalak
15
微软有一个正则表达式页面,其中包括了一个用于URL的表达式。这是个不错的起点:http://msdn.microsoft.com/en-us/library/ff650303.aspx。 注意:上述页面已过时,但表格中的表达式基本仍然有效供参考。 建议使用的URL表达式(对我来说也非常好用)是: "^(ht|f)tp(s?)://0-9a-zA-Z(:(0-9))(/?)([a-zA-Z0-9-.?,'/\+&%$#_])?$" - CMH
65个回答

2

您没有说明使用的是哪种语言。 如果是 PHP,那么有一个原生函数可以实现:

$url = 'http://www.yoururl.co.uk/sub1/sub2/?param=1&param2/';

if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
    // Wrong
}
else {
    // Valid
}

返回过滤后的数据,如果过滤失败则返回FALSE。 在这里查看 >> 希望能对您有所帮助。

2

我认为一些人无法使用你的php代码是因为隐含的修改器。我按原样复制了你的代码并作为示例使用:

if(
    preg_match(
        "/^{$IRI_reference}$/iu",
        'http://www.url.com'
    )
){
    echo 'true';
}

请注意 "i" 和 "u" 修饰符。如果没有 "u",PHP会抛出异常,错误信息为:
Warning: preg_match() [function.preg-match]: Compilation failed: character value in \x{...} sequence is too large at offset XX

2
以下正则表达式可行:
"@((((ht)|(f))tp[s]?://)|(www\.))([a-z][-a-z0-9]+\.)?([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+[/]?[a-z0-9._\/~#&=;%+?-]*@si"

2

使用这个,它对我有用

function validUrl(Url) {
    var myRegExp  =/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/i;

    if (!RegExp.test(Url.value)) {
        $("#urlErrorLbl").removeClass('highlightNew');
        return false;
    } 

    $("#urlErrorLbl").addClass('highlightNew'); 
    return true; 
}

2
https?:\/{2}(?:[\/-\w.]|(?:%[\da-fA-F]{2}))+

您可以使用此模式来检测URL。

以下是概念证明

RegExr: URL检测器

最初的回答


1
这不是正则表达式,但可以实现相同的功能(仅适用于Javascript):
function isAValidUrl(url) {
  try {
    new URL(url);
    return true;
  } catch(e) {
    return false;
  }
}

问题在于 h ttp://bla 是一个有效的 URL(h 和 t 之间的空格不会使其成为实际的 URL)。 - makeitmorehuman

1
这样如何:
^(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,})$

这些是测试用例:

Test cases

你可以在这里试试:https://regex101.com/r/mS9gD7/41


1

http://www.x.com.y 不正确,但它会导致通过。 - Zahid Khan

1

我使用这个正则表达式:/((https?:\/\/|ftp:\/\/|www\.)\S+\.[^()\n ]+((?:\([^)]*\))|[^.,;:?!"'\n\)\]<* ])+)/

虽然很短,但它可以处理一些边缘情况,例如以括号结尾的维基百科链接(https://en.wikipedia.org/wiki/Sally_(name)),而其他答案似乎没有涉及到这种情况。


1

为什么简单的FILTER_VALIDATE_URL有问题呢?

 $url = "http://www.example.com";

if(!filter_var($url, FILTER_VALIDATE_URL))
  {
  echo "URL is not valid";
  }
else
  {
  echo "URL is valid";
  }

我知道这不是问题的确切答案,但当我需要验证URL时,它对我很有帮助,所以我认为对于其他遇到相同情况的人来说也可能很有用。


1
这个问题正在寻找一个正则表达式,但你建议使用一些过滤器常量。你知道它是如何在内部搜索链接的吗? - Kuitsi
问题是:“检查字符串是否为有效URL的最佳正则表达式是什么?”有时问题不在于检查应该是URL的字符串,而在于您有一段文本,需要读取其中所有的URL,并且使用REGEX是唯一的方法。此外,OP要求提供一种不指定特定语言的解决方案,您的解决方案只能应用于特定平台。 - thermz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接