PHP preg_replace缩短字符串

时间:2011-01-22 03:17:30

标签: php regex preg-replace

所以我有这个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链接就像它仍然链接正确?

提前非常感谢! :)

3 个答案:

答案 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。

  1. 的preg_match
  2. 检查strlen是否匹配
  3. 如果需要
  4. ,请缩短[url] [/ url]之间的网址
  5. 构建替换字符串
  6. str_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 ");

(Codepad)

您可以看到我使用另一个preg_replace将一个很长的网址转换为一个很短的网址。我在中间切割它,同时完全保留域名,但你可以使用你想要的任何切割模式。