所以我有这个PHP代码:
$text = preg_replace("/(\s)http:\/\/([\S]+?)(\s)/i" ,
"$1[url=\"http://$2\"]http://$2[/url]$3" , " $text ");
我想它正在将http://xyz.xyz.xyz
种字符串替换为给定文本中的[url=http://xyz.xyz.xyz]http://xyz.xyz.xyz[/url]
(在我的情况下,它是我的论坛的postparser)对吗?
现在我要做的是,限制http://xyz.xyz.xyz
- [url=http://xyz.xyz.xyz]
http://xyz.xyz.xyz
< - [/url]
内的{{1}}字符串的stringlength }
因为有时用户会发布非常长的链接,这些链接会弄乱我的论坛设计并且看起来非常难看。
有没有一种方法我可以在php中实现这一点,同时保持1. http链接就像它仍然链接正确?
提前非常感谢! :)答案 0 :(得分:2)
怎么样:
$text = preg_replace("/(\s)http:\/\/([\S]{,40})([\S]*?)(\s)/i",
"$1[url=\"http://$2$3\"]http://$2[/url]$4" , " $text ");
将其限制为40个字符的网址?
答案 1 :(得分:1)
你可以将这个过程拆分成几行代码而不是一个do-it-all preg_replace。
答案 2 :(得分:1)
使用preg_replace_callback
,以便您可以更好地控制替换。 (例如,在$2
中使用[url=...]
并在文本中使用缩短版本的$2
。
function replace_links($matches) {
$url = $matches[2];
$short_url = preg_replace('~^([^/]*)/(.{14})(.{3,})(.{18})$~', '$1/$2...$4', $url);
return $matches[1] . '[url="http://' . $url . '"]http://' . $short_url . '[/url]' . $matches[3];
}
$text = preg_replace_callback("/(\s)http:\/\/([\S]+?)(\s)/i", 'replace_links', " $text ");
您可以看到我使用另一个preg_replace
将一个很长的网址转换为一个很短的网址。我在中间切割它,同时完全保留域名,但你可以使用你想要的任何切割模式。