【问题标题】:ereg_replace not working correctlyereg_replace 无法正常工作
【发布时间】:2013-06-13 09:37:35
【问题描述】:

我创建了一个消息系统,并希望在发布新消息时将消息中的 url 链接自动转换为可点击的 HTML 链接。 我写了这个简单的函数,但它不能正常工作:

    // LINK ALL URLS
  $message = ereg_replace("http://([.]?[a-zA-Z0-9_/-])*", "<a href=\"\\0\" target=\"_blank\">\\0</a>", $message);
  $message = ereg_replace("(^| |\n)(www([.]?[a-zA-Z0-9_/-])*)", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $message);

对于某些 url 它可以工作,但对于其他 url 则存在问题,结果如下:

<a href="http://www.example.com/index.php">http://www.example.com/index.php</a>?mode=index&page=1

<a href="http://www.youtube.com/watch">http://www.youtube.com/watch</a>?v=jSh5Y7jq9FQ

如您所见,它没有正确转换包括问号后面的部分。 有人可以修复/更新我上面的代码吗? 顺便说一句,除了使用 *ereg_replace* 之外,还有其他(更好的!)解决方案吗?

【问题讨论】:

  • 自 PHP 5.3.0 起,该函数已被弃用。强烈建议不要依赖此功能。解决方法:使用preg_replace()
  • 感谢您提供此信息,我知道它已被弃用,现在我只是在寻找快速修复,将来我将使用 preg_replace()。
  • @netsetter - 老实说,将 ereg 转换为 preg 非常容易。 99% 的情况只涉及更改函数名称并在字符串末尾添加分隔符。你真的应该这样做。此外,值得补充的是,它不仅在 5.3 中已弃用,而且已从 5.4 中完全删除。当您仍在运行同时支持两者的版本时,更改它会更容易很多(这就是执行弃用过程的原因),因此我强烈建议尽早更改它。
  • @Spudley:好的,如果你说转换非常容易,我现在会花时间更新代码。谢谢。

标签: php html url ereg-replace


【解决方案1】:

这是我现在使用的解决方案,它似乎工作正常,包括问号修复和 cmets 中将 ereg_replace() 转换为 preg_replace() 的建议:

// LINK ALL URLS
      $message = preg_replace("#http://([.]?[a-zA-Z0-9_/-?])*#", "<a href=\"\\0\" target=\"_blank\">\\0</a>", $message);
      $message = preg_replace("#(^| |\n)(www([.]?[a-zA-Z0-9_/-?])*)#", "\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>", $message);

【讨论】:

    【解决方案2】:
     $message = preg_replace('#((?:[a-zA-Z]+://|www)[^ ]+)#i', '<a href="$0">$0</a>', $message);
    

    这可能对你有帮助

    【讨论】:

    • 比我的代码更专业、更短,并且可以正常工作
    • 哦,等一下,它可以正常工作,但前提是消息中只有 一个链接,但如果有超过 1 个链接,它就不能正常工作了,你有没有解决方案?
    【解决方案3】:

    您的正则表达式不允许使用? 字符,因此链接当然会在任何查询字符串之前切断。将? 放入您的角色类中。当您使用它时,您还需要允许每个其他有效的 URL 字符。

    请咨询 this question 及其答案,了解什么是有效的 URL 正则表达式。

    【讨论】:

    • 你是对的,将问号放入允许的字符部分,它现在可以工作了。谢谢
    猜你喜欢
    • 2014-03-18
    • 2016-12-01
    • 1970-01-01
    • 2016-09-01
    • 2012-07-11
    • 2018-04-08
    • 2017-04-20
    • 2018-10-02
    • 2016-09-04
    相关资源
    最近更新 更多