如何在 PHP 中的特定 word/character 限制后添加“...”?

How to add a "..." after a particular word/character limit in PHP?

我正在编写如下所示的 php 代码:

<div class="case-breaking__content">
    <p><?php echo the_title(); ?></p>
</div>
      

以上php代码returns以下内容:

absv shss xcnx shss hshhs shhsw shshs hsnna hssnnss hssns snnss nnshs sjjjjsjsj nsnnnsns jjsnss snsnns nsnns 

我想要的是,在一个特定的字数限制之后它应该显示...假设在 8 个字之后它应该是这样的;

absv shss xcnx shss hshhs shhsw shshs hsnna...

我尝试了以下方式,但它显示了所有单词:

<div class="case-breaking__content">
<p><?php $out = strlen(the_title()) > 50 ? substr(the_title(),0,50)."..." : the_title(); ?></p>
</div>

您可以简单地对空格执行 preg_split,然后将数组连接回一个字符串,如果您愿意,可以限制数量:

$str = "absv shss xcnx shss hshhs shhsw shshs hsnna hssnnss hssns snnss nnshs sjjjjsjsj nsnnnsns jjsnss snsnns nsnns
";

$arr = preg_split('/(\s)/m', $str);
$limit = 8;
$title = '';
foreach ($arr as $key => $value) {
    if ($key < $limit) {
        $title .= $value . " ";
    } else {
        $title .= "...";
        break;
    }
}

var_dump($title);

输出

string(47) "absv shss xcnx shss hshhs shhsw shshs hsnna ..."

您还可以添加一个 if 语句,以防单词数少于您想要的限制,以便打破循环,可能类似于:

$str = "absv shss xcnx shss hshhs";
// $str = "absv shss xcnx shss hshhs shhsw shshs hsnna hssnnss hssns snnss nnshs sjjjjsjsj nsnnnsns jjsnss snsnns nsnns";

$arr = preg_split('/(\s)/m', $str);
$limit = 8;
$title = '';
foreach ($arr as $key => $value) {
    if (sizeof($arr) < $limit - 1) {
        $title .= $str . " ...";
        break;
    }
    if ($key < $limit) {
        $title .= $value . " ";
    } else {
        $title .= "...";
        break;
    }
}

var_dump($title);

输出

string(29) "absv shss xcnx shss hshhs ..."

实施

如果您希望实现此代码,这可能有效:

$arr = preg_split('/(\s)/m', get_the_title());
$limit = 8; // number of words limit
$title = '';
foreach ($arr as $key => $value) {
    if (sizeof($arr) < $limit - 1) {
        $title .= get_the_title() . " ...";
        break;
    }
    if ($key < $limit) {
        $title .= $value . " ";
    } else {
        $title .= "...";
        break;
    }
}

$out = '<div class="case-breaking__content">';
$out .= '<p>';
$out .= $title;
$out .= '</p>';
$out .= '</div>';

echo $out;

the_title() 回应标题而不是返回它。如果你正在对其执行操作,那么你想使用 get_the_title().

<div class="case-breaking__content">
<p><?php echo strlen(get_the_title()) > 50 ? substr(get_the_title(), 0, 50) . "..." : get_the_title(); ?></p>
</div>

也就是说,如果您使用的是 WordPress,最简单的选择是使用 built-in 函数 wp_trim_words() https://codex.wordpress.org/Function_Reference/wp_trim_words

所以在你的情况下

<div class="case-breaking__content">
<p><?php echo wp_trim_words( get_the_title(), 8, '...') ?></p>
</div>
<div class="case-breaking__content">
    <?php $words = explode(" ", the_title()); ?>
    <p><?php echo count($words) <= 8 ? the_title() : implode(" ", array_slice($words, 0, 8)) . "..."; ?></p>
</div>

普通 PHP 解决方案,不需要比这更复杂。

我不使用 WordPress,但它 source code for wp_trim_words() 看起来比我喜欢的要麻烦。

the_title() 的默认行为是 echo 字符串。在这种情况下,您需要 return 字符串,以便它可以在回显之前发生变化。这是通过将其第三个参数设置为 false 来实现的。 https://developer.wordpress.org/reference/functions/the_title/

或者更简单地调用 get_the_title().

要有条件地应用字数限制,单个 preg_replace() 调用就足够了。

从逻辑上讲,除非超过字数限制,否则添加省略号是没有意义的,我下面的模式检查 8 组零个或多个空格后跟一个或多个非空格。如果有 8 个“单词”和至少一个字符要删除,则 \K“忘记”先前匹配的 8 个单词,然后用三个点替换输入字符串的其余部分。

代码:(Demo with hardcoded sample strings)

$wordLimit = 8;
echo preg_replace('/(?:\s*\S++){' . $wordLimit . '}\K.+/', '...', get_the_title());

\S++ 所有格的一个或多个量词强制非空白字符的贪婪匹配——这确保匹配最终单词的 all