ereg_replace无法正常工作

时间:2013-06-17 12:23:58

标签: php html url ereg-replace

我创建了一个消息系统,如果发布了新消息,我希望将消息中的url-links自动转换为可点击的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);

对于某些网址,它正在运行,但与其他网址存在问题,结果如下:

<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 *?

3 个答案:

答案 0 :(得分:2)

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

这可能对您有所帮助

答案 1 :(得分:2)

这是我现在使用的解决方案似乎正常工作,包括问号修复和注释中的建议,以将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 :(得分:1)

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

请参阅this question及其答案,了解制作有效网址正则表达式的原因。