1

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

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

上面的 php 代码返回以下内容:

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>
4

4 回答 4

3

如果您愿意,您可以简单地执行一个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;
于 2019-05-08T16:10:26.773 回答
2

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,最简单的选择是使用内置函数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>
于 2019-05-08T16:21:57.223 回答
1

我不使用 WordPress,但它的源代码wp_trim_words()看起来比我喜欢的要麻烦。

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

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

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

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

代码:(带有硬编码示例字符串的演示

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

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

于 2021-11-04T11:15:47.293 回答
1
<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>

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

于 2019-05-08T16:34:31.350 回答