我使用此功能使链接可点击:
function clickable($text) {
$text = preg_replace("/(https?|ftps?|mailto):\/\/([-\w\p{L}\.]+)+(:\d+)?(\/([\w\p{L}#-;+-\/_\.]*(\?\S+)?)?)?/u", '<a target="_blank" href="$0">$0</a>', $text);
return $text;
}
它工作正常,但有一个小问题。如果$ text变量包含这样的字符串:
一些文字
即。链接,换行符和一些文字,我得到错误的结果。而不是:
<a target="_blank" href="http://example.com">http://example.com</a>
它变成了:
<a target="_blank" href="http://example.com<br">http://example.com</a>
/>
some text
以下是我在网站上显示文字的方式:
<?php echo clickable(nl2br($db['content'])); ?>
nl2br函数将所有换行符转换为html <br />
标记,但此函数认为它应该将此标记保留在url中...
希望我很清楚:)
有什么想法吗?
答案 0 :(得分:2)
在您的模式结束时,您有\S+
- 这允许所有非空格字符,包括<
,以及您的正则表达式无法按预期工作的原因。我不太确定该部分的作用是什么,请考虑删除(\?\S+)?
并查看它是否适合您。
另一种选择是将该组更改为:[^\s<]*
- 这不会捕获空格和<
符号,正好解决了这个问题......