1

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

目前,代码会为要替换的 URL 引发错误“http://localhost/mysitename”,但确实接受新 URL“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);
}
4

3 回答 3

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]+[^,.?!:;])?)/

看看它是否适用于您的数据。那个很松,但对于一次性转换来说可能已经足够好了。这应该与这些中的 URL 正确匹配:

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

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

于 2011-08-31T02:31:40.027 回答
1

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

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

于 2011-08-31T02:34:18.810 回答
0

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

https://github.com/ErisDS/Migrate

于 2011-09-06T01:00:10.447 回答