我创建了一个消息系统,如果发布了新消息,我希望将消息中的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 *?
答案 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及其答案,了解制作有效网址正则表达式的原因。