我正在尝试在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);
}
答案 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上更新项目以包含此修复程序。谢谢你的帮助。