2011-11-23 41 views
8

我有以下的正则表达式来检查,看是否有URL是有效的:修改正则表达式以在检查URL时允许IP地址?

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可能想要网址http://search.google - 而不是http://google.com搜索)

无论如何,我想添加允许的IP地址也是一个有效的URL的能力,但我不能确定如何因素是进入正则表达式

如果任何人都可以伸出援手,那就太好了!

+3

您可能想要使用['filter_var('http://example.com',FILTER_VALIDATE_URL)'](http://php.net/manual/en/function.filter-var.php) – NullUserException

+0

I没有意识到PHP内置了URL过滤器 - 感谢您指出了这一点...... – MrJ

回答

8

此正则表达式似乎工作:

^(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”后,它只是执行或操作,要匹配域名或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); 
+0

不错的 - 谢谢你的解释:) – MrJ

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!