2011-08-31 186 views
1

的正则表达式URL匹配问题我正尝试在GitHub https://github.com/ErisDS/Migrate上使用此项目,将Wordpress数据库中的URL设置从Localhost dev安装迁移到实时URL。http:// localhost/

目前的代码抛出的URL错误将被替换的“http://本地主机/ mysitename”,但并接受新的URL“http://www.mywebsitename.com”

从我可以告诉错误来自这个正则表达式不验证本地主机作为一个有效的URL - 任何想法如何我可以更新此接受本地主机的URL?

完整的代码可以在GitHub上查看。

function checkURL($url) 
{ 
    $url_regex = '/^(http\:\/\/[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4}(?:\/[a-zA-Z0-9_]+)*(?:\/[a-zA-Z0-9_]+\.[a-zA-Z]{2,4}(?:\?[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)?)?(?:\&[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)*)$/'; 
if($url == 'http://') 
{ 
return false; 
}  
return preg_match($url_regex, $url); 
} 
+1

我得到这个从使用RegexBuddy:'(HTTPS | FTP |文件?):// [-A-Z0-9 + @#/%=〜_ | $:?!; ] * [A-Z0-9 + @#/%=〜_ | $]' –

回答

2

您可以将其更改为它添加 “localhost” 的到可接受的主机名:

/^(http\:\/\/(?:[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4}|localhost)(?:\/[a-zA-Z0-9_]+)*(?:\/[a-zA-Z0-9_]+\.[a-zA-Z]{2,4}(?:\?[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)?)?(?:\&[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)*)$/ 

这部分http://前缀匹配:

http\:\/\/ 

而且这部分的主机名匹配:

[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4} 

所以你可以改变主机名检查,以明确包括“本地主机”非捕获交替组:

(?:X|localhost) 

其中X是现有主机名匹配的子表达式。 (?:位启动一个非捕获组,使用非捕获组可以确保任何组编号引用不会混乱。

还有一些活生生的实例:http://ideone.com/M0qqh

我认为一个简单的正则表达式可能有助于你更好的,虽然,一个不带参数的CGI处理得非常好。你可以试试这个:

/(http:\/\/[^\/]+\/([^\s]+[^,.?!:;])?)/ 

看看它是否适用于你的数据。那个很宽松,但可能足够完成一次转换。这应该适当地匹配这些网址:

'here is a URL http://localhost/x?a=b.' 
'More http://example.com nonsense!. 

您也可以尝试Joseph的评论。

1

它不工作,因为在正则表达式中的某个地方,你要求在http:///之间的点。 http://localhost/whatever没有点,所以它失败。

你真的应该使用类似filter_var()parse_url()而不是正则表达式来进行URL验证。

相关问题