【问题标题】:Alter regex to allow IP address when checking URL?检查 URL 时更改正则表达式以允许 IP 地址?
【发布时间】:2011-11-23 21:38:43
【问题描述】:

我有以下正则表达式来检查 URL 是否有效:

preg_match('/^(http(s?):\/\/)?(www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/i', $url);

我喜欢将这部分[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})(至少我希望它是这个粗体部分)修改为IP地址或这个突出显示的部分。

目前,正则表达式对我来说非常好,因为它可以正确找到错误的 URL——尽管我相信一旦 ICANN 的新域政策生效(即 Google 可能希望拥有url http://search.google - 而不是 http://google.com 用于搜索)

无论如何,我想添加允许 IP 地址也成为有效 URL 的功能,但我不确定如何将其纳入正则表达式

如果有人能伸出援手,那就太好了!

【问题讨论】:

标签: regex url


【解决方案1】:

这个正则表达式似乎有效:

^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$

在检查“http”之后的部分,它只是执行 OR 操作,以匹配域名或 IP。以下是相关摘录:

((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)

IP 表达式有点长,但它确保它是一个有效的 IP(例如,不是999.999.999.999)。您可以轻松地将其替换为另一个 IP 检查。

这里它被合并到你之前的代码中:

preg_match('/^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/i', $url);

【讨论】:

  • 不适用于这样的链接:<a href="/default/index/tourl?u=aHR0cDovL3d3dzMuZXhhbXBsZS5jb20%2FcT1hc2QmZj0jYXNkPC9jb2Rl" rel="nofollow" target="_blank">www3.example.com?q=asd&amp;f=#asd&lt;/code</a>&gt;
  • 如果您还想使用上述检查端口:^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)(:[0-9]{1,5})?|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(:[0-9]{1,5})?(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&amp;\=]*)?$
【解决方案2】:

两点。顶部level domains 现在似乎最多 6 个字符(博物馆),所以我们需要考虑到这一点:

^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,6})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$

在基于 C 的语言中,我们需要转义那些 \

char *regex = "/^(http(s?):\\/\\/)?(www\\.)?+[a-zA-Z0-9\\.\\-\\_]+(\\.[a-zA-Z]{2,6})+(\\/[a-zA-Z0-9\\_\\-\\s\\.\\/\\?\\%\\#\\&\\=]*)?$/i";

在 Objective C 中,我们可以在 NSString 上定义一个类别方法:

- (BOOL)isURL
{
    // uses ICU regex syntax http://userguide.icu-project.org/strings/regexp
    NSString *regex = @"^(http(s?)://)?(www\\.)?+[a-zA-Z0-9\\.\\-_]+(\\.[a-zA-Z]{2,6})+(/[a-zA-Z0-9_\\-\\s\\./\\?%#\\&=]*)?$";

    NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [regextest evaluateWithObject:self];
}

请注意,此解决方案完全忽略了 IPv6!

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 2011-05-26
    • 1970-01-01
    • 2014-09-28
    • 2011-06-20
    • 2017-03-15
    • 2015-11-22
    相关资源
    最近更新 更多