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


What is most elegant way to clip a string between words, after n characters?

给定一个字符串,在不分解单词的情况下,在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...
function summary($str,$len)
{
    return trim(preg_replace("/^(.{0,$len})''s.*/","''1",$str.' '));
}

取0..$len将字符变成一个空格,并返回该空格。例子:

$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短的字符串会被截断一个单词,添加一个空格来防止这种情况。(quick&脏)

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

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

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

这是一个简单而优雅的实现。改编自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";
?>

这个Perl正则表达式应该能做到

/^ (. *) {100}/

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

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

例如

echo substr($str,0,100);

您可以使用以下链接作为参考。

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