1

我有一个小函数,它遍历一堆文本并以文本形式查找任何 url 并将它们转换为 html a's:

例如

normal text lipsum etc http://www.somewebsitelink.com lipsum lipsum

变成:

normal text lipsum etc <a href="www.somewebsitelink.com">http://www.somewebsitelink.com</a> lipsum lipsum

我的功能如下:

function linkify($text)
{
  $text = eregi_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)',
'<a target="_blank" href="\\1">\\1</a>', $text);

  $text = eregi_replace('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)',
'\\1<a target="_blank" href="http://\\2">\\2</a>', $text);

  return $text;
}

一切正常,但是我使用此功能并打印出 html 的地方是在有限的宽度空间中,有时链接最终会变得更大,然后可以容纳在空间中,最终导致溢出。

我想知道如何去做两件事:

一个。从文本中删除不必要的,即“http://”,所以我最终会得到

<a href="http://www.somewebsitelink.com">www.somewebsitelink.com</a>

湾。如果文本超过 20 个字符,请将其后面的所有内容剪掉并添加几个点。例如:

<a href="http://www.somewebsitelink.com">www.somewebsitelin...</a>

我想知道我是否可能不得不在不使用正则表达式的情况下这样做,但是我对 reg exp 的理解还是相当有限的。

4

3 回答 3

2
$link = 'http://www.somewebsitelink.com';
function linkify($text, $maxLen = 15)
{
  return preg_replace_callback('(((f|ht){1}tp://)([-a-zA-Z0-9@:%_\+.~#?&//=]+))', function($t) use ($maxLen) {
      if ( strlen($t[3]) > $maxLen)
        $t[3] = substr_replace($t[3], '...', $maxLen);

      return sprintf('<a target="_blank" href="%s">%s</a>', $t[0], $t[3]);
  }, $text);
}

header('content-type: text/plain');
echo linkify($link);

PHP <= 5.2 的代码

$link = 'http://www.somewebsitelink.com';
function linkify($text, $maxLen = 15)
{
    $funcBody = <<<FUNC
if ( strlen(\$t[3]) > \$maxLen)
  \$t[3] = substr_replace(\$t[3], '...', \$maxLen);   

return sprintf('<a target="_blank" href="%s">%s</a>', \$t[0], \$t[3]);   
FUNC;
      $func = create_function(
        '$t, $maxLen =' . $maxLen,
        $funcBody
    );
    return preg_replace_callback('(((f|ht){1}tp://)([-a-zA-Z0-9@:%_\+.~#?&//=]+))', $func, $text);
}

header('content-type: text/plain');
echo linkify($link);

结果是

<a target="_blank" href="http://www.somewebsitelink.com">www.somewebsite...</a>
于 2012-11-02T12:23:44.700 回答
2

我认为这将满足您的需求。它将一个 url 作为其唯一参数并删除前导 'http://www." 然后如果它少于 20 个字符则返回该字符串。如果它超过 20 个字符它返回前 17 个字符并附加 '.. .'.

function get_formatted_url($url){
    $url = trim($url);
    $url = str_replace("http://www.", "", strtolower($url)); 
    if(strlen($url) > 20){
        return substr($url, 0, 16) . '...';
    }else{
        return $url;
    }
}

编辑:使用 preg_replace_callback() 的示例

function get_formatted_url($url){
    $url = $url[0];
    $formatted_url = trim($url);
    $formatted_url = str_replace("http://www.", "", strtolower($formatted_url)); 
    if(strlen($formatted_url) > 20){
        return '<a href="'.$url.'" />'. substr($formatted_url, 0, 16) . '... </a> ';
    }else{
        return '<a href="'.$url.'" />'. $formatted_url . '</a> ';
    }
}

function linkify($text){
    $reg = '(((f|ht)tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)';
    $text = preg_replace_callback($reg, "get_formatted_url", $text);
    return $text;
}



$text = "abcd http://www.abc.com?hg=alkdjfa;lkdjfa;lkdjfa;lkdsjfa;ldks abcdefg http://www.abc.com";
echo linkify($text);
于 2012-11-02T12:22:48.023 回答
0

使用 php substr 函数。例如:

<?php substr($text,0,10);?>
于 2012-11-02T12:10:11.337 回答