如何在 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。
我正在编写如下所示的 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。