在n个字符后,在单词之间剪辑字符串的最优雅方法是什么?

时间:2011-08-27 00:35:17

标签: php substring

给定一个字符串,在没有分解单词的情况下,在n个字符后生成子字符串的最佳方法是什么?

示例:

$str = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum."
echo summary($str,100); // i.e. summary($string,$numberOfCharacters);

应该导致:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tindunt laoreet...

6 个答案:

答案 0 :(得分:1)

这可能对您有所帮助: http://www.php.net/manual/en/function.wordwrap.php#99828

function cutstr($str, $length, $ellipsis=''){
   $cut=(array)explode('\n\n',wordwrap($str),$length,'\n\n'));
   return $cut[0].((strlen($cut)<strlen($str))?$ellipsis:'');
}

答案 1 :(得分:1)

function summary($str,$len)
{
    return trim(preg_replace("/^(.{0,$len})\\s.*/","\\1",$str.' '));
}

这需要0 .. $ len chars一个空格,然后返回。例如:

$str = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.";

for ( $i=20;$i<30;$i++ ) echo summary($str,$i)."\n";

输出:

Lorem ipsum dolor
Lorem ipsum dolor sit
Lorem ipsum dolor sit
Lorem ipsum dolor sit
Lorem ipsum dolor sit
Lorem ipsum dolor sit
Lorem ipsum dolor sit
Lorem ipsum dolor sit amet,
Lorem ipsum dolor sit amet,
Lorem ipsum dolor sit amet,

编辑:您可能希望trim()输出,以删除空格。

Edit2:字符串短于$ len会有一个字断掉,添加了一个空格来防止这种情况发生。 (快速和安培;脏)

PS。您可能希望将\\s替换为您认为合适的非单词模式。我建议[^a-zA-Z]

答案 2 :(得分:1)

这是一个简单而优雅的实现。 改编自http://code.web-max.ca/truncate_string.php

<?php
function summary($details,$max)
{
    if(strlen($details)>$max)
    {
        $details = substr($details,0,$max);
        $i = strrpos($details," ");
        $details = substr($details,0,$i);
        $details = $details."...";
    }
    return $details;
}

$str = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.";

echo summary($str,100); // i.e. summary($string,$numberOfCharacters);

?>

如果您更喜欢更面向对象的方法,几年前我写了下面的课程。它可以使用一些增强功能,但它可以完成工作。它具有剥离HTML标记的额外好处,您可以选择与标准不同的内容...用于跟踪字符串。

<?php
/**
 * Example:
 * $text = "<p>Lorem ipsum dolor sit amet, consectetur <em>adipiscing</em> elit. Etiam tortor
 * justo, elementum non sollicitudin id, pharetra sit amet dolor. Sed porta mollis mauris,
 * vitae blandit nunc volutpat ac. In eros lorem, faucibus non commodo vel, vulputate ac
 * mauris.</p>";
 *
 * $short = new ShortText($text);
 * $short->ellipsesString = '&raquo;';
 * echo $short->trimTo(60),"\n\n";
 *
 * Result:
 * Lorem ipsum dolor sit amet, consectetur adipiscing elit.»
 */
class ShortText
{
    public $ellipses;
    public $stripHtml;
    public $ellipsesString;

    private $text;

    public function __construct($text)
    {
        $this->ellipses = true;
        $this->stripHtml = true;
        $this->ellipsesString = '...';
        $this->text = $text;
    }

    /**
     * trims text to a space then adds ellipses if desired
     * @param string $input text to trim
     * @param int $length in characters to trim to
     * @param bool $ellipses if ellipses (...) are to be added
     * @param bool $strip_html if html tags are to be stripped
     * @return string 
     */
    public function trimTo($length)
    {
        $input = $this->text;

        //strip tags, if desired
        if ($this->stripHtml) {
            $input = strip_tags($input);
        }

        //no need to trim, already shorter than trim length
        if (strlen($input) <= $length) {
            return $input;
        }

        //find last space within length
        $last_space = strrpos(substr($input, 0, $length), ' ');
        $trimmed_text = substr($input, 0, $last_space);

        //add ellipses (...)
        if ($this->ellipses) {
            $trimmed_text .= $this->ellipsesString;
        }

        return $trimmed_text;
    }
}

$str = "<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.</p>";

$short = new ShortText($str);
echo $short->trimTo(100),"\n\n";
?>

答案 3 :(得分:0)

这个Perl Regex应该这样做

  

/ ^(。*){100} /

答案 4 :(得分:0)

function summary($string, $length)
{
    return ($offset = @stripos($string, ' ', $length) !== FALSE) ?
        substr($string, 0, ($length + $offset)) . '...' : $string;
}

答案 5 :(得分:-1)

您可以使用PHP substr 函数来获取单个单词或语句的子字符串

例如。

echo substr($str,0,100);

供您参考,您可以使用以下链接。

http://php.net/manual/en/function.substr.php