代码之家  ›  专栏  ›  技术社区  ›  Ricardo

PHP通过剪切x字符后最后一个空格的字符串来进行摘录

php
  •  3
  • Ricardo  · 技术社区  · 6 年前

            $string = 'Стихи похожи на людей: помнят прошлое и ничего не знают о будущем, хотят жить вечно, a страница уже перелистывается.';
    
            if (mb_strlen($string ) > 110) {
                $pos = mb_strpos($string , ' ', 110);
                $excerpt = rtrim(mb_substr($string, 0, $pos), '.,—-_!@\'"()*#~').'...';
            }
    

    如果我用 print_r(mb_strlen($pos)); 结果 $pos 0 $pos位 $pos = mb_strpos($quote_content, ' ', 99);

    在本例中,最后一个字是16个字符长,整个字符串是116个字符长,因此,对于为什么99偏移量可以工作,而上面的任何内容都会导致 $pos位 0 ...

    我有相当多的字符串在这里不同的字符串长度和单词长度,所以我需要一个动态的解决方案,将在所有情况下工作。有什么想法吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Nick SamSmith1986    6 年前

    一种简单(快速)将字符串剪切为固定字符数的方法是 preg_replace :

    $string = 'Стихи похожи на людей: помнят прошлое и ничего не знают о будущем, хотят жить вечно, a страница уже перелистывается.';
    $excerpt = preg_replace('/^(.{1,110})\s.*$/u', '$1...', $string);
    echo $excerpt;
    

    输出:

    Стихи похожи на людей: помнят прошлое и ничего не знают о будущем, хотят жить вечно, a страница уже...
    

    ^(.{1,110})\s (从1到110)从字符串的开头一直到空格字符。由于量词是贪婪的,它需要尽可能多的字符。这些角色在一组中被捕获。然后字符串的其余部分与 .*$ ,整个字符串被第一个捕获组和三个 .'s ( $1... ),根据需要只提供第一部分。这个 u regex上的标志表示它将正确计数unicode字符。要调整摘录的长度,只需更改 110

    Regex101 demo

    regex也可以被修改,去掉任何非单词字符(这样你就不会以 the quick brown fox,... )通过修改它来坚持捕获组的最后一个字符是 word 字符,然后允许以下字符为非单词字符:

    $string = 'Стихи похожи на людей: помнят прошлое и ничего не знают о будущем, хотят жить вечно, a страница уже перелистывается.';
    $excerpt = preg_replace('/^(.{1,23}\w)\W.*$/u', '$1...', $string);
    echo $excerpt;
    

    Стихи похожи на людей...
    

    Updated demo

        2
  •  1
  •   Francesco G.    6 年前

    这将在最后一个空格处剪切字符串,而不剪切单词:

    $excerpt = mb_substr($string, 0, mb_strrpos($string, ' ', -(mb_strlen($string) - 110)));
    

    strrpos mb_strrpos

        3
  •  0
  •   Ulrich Dohou    6 年前

    一个懒散的修补程序,从110开始检查所有字符,直到找到空间为止

        // lazy fix by checking all chars from 110 until space was found
    
        if (mb_strlen($string) > 110) {
            $p = 110;
            while(!($pos = mb_strpos($string , ' ', $p--))){};
            $excerpt = rtrim(mb_substr($string, 0, $pos), '.,—-_!@\'"()*#~') . ' ... ';
        }