我有以下正则表达式来检查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的功能,但我不确定如何将其纳入正则表达式
如果有人可以伸出援助之手,那就太棒了!
答案 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!