【问题标题】:Problem with Regular Expression URL matching for http://localhost/http://localhost/ 的正则表达式 URL 匹配问题
【发布时间】:2011-11-07 06:57:06
【问题描述】:

我正在尝试使用 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);
}

【问题讨论】:

  • 我是从 RegexBuddy 那里得到的:(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|$!:,.;]*[A-Z0-9+&@#/%=~_|$]

标签: php regex wordpress migrate


【解决方案1】:

您可以将“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!.

你也可以从评论中试试 Joseph 的。

【讨论】:

    【解决方案2】:

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

    您确实应该使用 filter_var()parse_url() 之类的东西来代替正则表达式来验证 URL。

    【讨论】:

      【解决方案3】:

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

      https://github.com/ErisDS/Migrate

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多