如何在PHP中缩短非常长的字符串

时间:2010-09-01 08:55:50

标签: php wordpress

我使用的PHP面包屑功能有问题,当页面名称很长时,它会溢出开箱即用,然后看起来很难看。

我的问题是,我怎样才能实现这个目标:“这是一个很长的字符串”到“这是......”用PHP?

关于我如何处理这个问题的任何其他想法也将被提前感谢!

这是面包屑功能:

function breadcrumbs() {
 // Breadcrumb navigation
    if (is_page() && !is_front_page() || is_single() || is_category()) {
        echo '<ul class="breadcrumbs">';
        echo '<li class="front_page"><a href="'.get_bloginfo('url').'">'.get_bloginfo('name').'</a> <span style="color: #FFF;">&raquo;</span> </li>';

        if (is_page()) {
            $ancestors = get_post_ancestors($post);

            if ($ancestors) {
                $ancestors = array_reverse($ancestors);

                foreach ($ancestors as $crumb) {
                    echo '<li><a href="'.get_permalink($crumb).'">'.get_the_title($crumb).'</a> <span style="color: #FFF;">&raquo;</span> </li>';
                }
            }
        }

        if (is_single()) {
            $category = get_the_category();
            echo '<li><a href="'.get_category_link($category[0]->cat_ID).'">'.$category[0]->cat_name.'</a></li>';
        }

        if (is_category()) {
            $category = get_the_category();
            echo '<li>'.$category[0]->cat_name.'</li>';
        }

        // Current page
        if (is_page() || is_single()) {
            echo '<li class="current">'.get_the_title().'</li>';
        }
        echo '</ul>';
    } elseif (is_front_page()) {
        // Front page
        echo '<ul class="breadcrumbs">';
        echo '<li class="front_page"><a href="'.get_bloginfo('url').'">'.get_bloginfo('name').'</a></li>';
        echo '<li class="current">Home Page</li>';
        echo '</ul>';
    }
}

8 个答案:

答案 0 :(得分:5)

如果你想要一个更好的(字数限制)trucation,你可以使用explode用空格分割字符串然后追加每个单词(数组条目)直到你达到你的最大限度

类似的东西:

define("MAX_LEN", 15);
$sentance = "Hello this is a long sentance";
$words = explode(' ', $sentance);
$newStr = "";
foreach($words as $word) {
  if(strlen($newStr." ".$word) >= MAX_LEN) {
     break;
  }
  $newStr = $newStr." ".$word;
}

答案 1 :(得分:5)

如果您使用UTF-8作为字符集,我建议使用mb_strimwidth方法,因为它是多字节安全的并且不会弄乱多字节字符。它还会自动添加...这样的占位符字符串,substr您必须在另外的步骤中执行此操作。

使用示例:

echo mb_strimwidth("Hello World", 0, 10, "...", "UTF-8"); // .. or some other charset
// outputs Hello W...

答案 2 :(得分:2)

您可以安全地使用substr

答案 3 :(得分:1)

并最终wordwrap()打破长话

答案 4 :(得分:1)

$ string =“这是一个非常长的字符串”;

$ newString = substr($ string,0,7)。“...”;

//输出=这是......

答案 5 :(得分:1)

理想情况下,它应该在客户端完成。您可以使用CSS / JS。

设置此CSS属性:text-overflow: ellipsis。 但是,它只能在IE中使用。要在Firefox中使用相同的功能,您可以执行this

之类的操作

如果您不介意使用javascript插件,请使用jQuery ellipsis plugin之一。

编辑:这些方法即使在处理unicode时也能正常工作,如果你尝试用php处理这个问题,这可能有点棘手。 (与substr函数一样)

编辑2:如果您的问题只是溢出的文字,并且您不介意最后没有“...”那么它就更简单了。只需使用CSS:text-overflow: hidden;

答案 6 :(得分:0)

您可以截断最大长度的字符串,然后搜索最后一个空格:

多字节安全(需要PHP&gt; = 4.2)

function mb_TruncateString($string, $length = 40, $marker = "...")
{
    if (mb_strlen($string) <= $length)
        return $string;

    // Trim at given length
    $string = mb_substr($string, 0, $length);

    // Get the text before the last space
    if(mb_ereg("(.*)\s", $string, $matches))
        $string = $matches[1];

    return $string  . $marker;
}

以下不是多字节安全

function TruncateString($string, $length = 40, $marker = "...")
{
    if (strlen($string) <= $length)
        return $string;

    // Trim at given length
    $string = substr($string, 0, $length);

    // Get the text before the last space
    if(preg_match("/(.*)\s/i", $string, $matches))
        $string = $matches[1];

    return $string  . $marker;
}

答案 7 :(得分:-2)

您正在执行截断功能。这就是我使用的:

/**
 * @param string $str
 * @param int $length
 * @return string
 */
function truncate($str, $length=100)
{
    $str = substr($str, $length);
    $words = explode(' ', $str); // separate words into an array
    array_pop($words); // discard last item, as 9/10 times it's a partial word
    $str = implode(' ', $words); // re-glue the string
    return $str;
}

用法:

echo truncate('This is a very long page name that will eventually be truncated', 15);