http:// localhost /的正则表达式URL匹配问题

时间:2011-08-31 02:17:51

标签: php regex wordpress migrate

我正在尝试在GitHub上使用此项目https://github.com/ErisDS/Migrate将我的Wordpress数据库中的URL设置从Localhost dev安装迁移到实时URL。

目前代码抛出错误,要将URL替换为“http:// localhost / mysitename”,但确实接受新网址“http://www.mywebsitename.com”

从我所知道的错误来自这个正则表达式,而不是将localhost验证为有效的URL - 任何想法我如何更新它以接受localhost 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);
}

3 个答案:

答案 0 :(得分: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}

因此,您只需将主机名检查器更改为明确包含“localhost”的非捕获交替组:

(?:X|localhost)

其中X是现有的主机名匹配子表达式。 (?:位启动非捕获组,使用非捕获组确保任何组号引用都不会搞砸。

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

我认为一个简单的正则表达式可能会为您提供更好的服务,但是它并不能很好地处理CGI参数。你可以试试这个:

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

并查看它是否适用于您的数据。那个很松散,但可能足以进行一次性转换。这应该与以下网址正确匹配:

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

你也可以从评论中尝试约瑟夫。

答案 1 :(得分:1)

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

您确实应该使用filter_var()parse_url()之类的内容而不是正则表达式进行网址验证。

答案 2 :(得分:0)

MIGRATE脚本的作者已在GitHub上更新项目以包含此修复程序。谢谢你的帮助。

https://github.com/ErisDS/Migrate