在检查URL时改变正则表达式以允许IP地址?

时间:2011-11-23 21:38:43

标签: regex url

我有以下正则表达式来检查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地址或突出显示的部分。

目前,正则表达式对我来说非常好,因为它正确地找到了错误的网址 - 尽管我认为一旦ICANN的新域名政策上线(即谷歌可能希望拥有),这将开始无法正常工作网址http://search.google - 代替http://google.com进行搜索)

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

如果有人可以伸出援助之手,那就太棒了!

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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";

在目标C中,我们可以在NSString上定义一个类别Method:

- (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!