我试图限制使用PHP从字符串返回的字符数。
我已经应用了似乎使服务器崩溃的解决方案(高负载/无限循环),所以我要求替代方案。
我正在尝试找到一个剪切字符串并显示特定字符数的解决方案,但仍然尊重句子的含义,即它不会在单词的中间进行剪切
我的函数调用如下:
<?php
uc_textcut(get_the_title());
?>
在我的functions.php中,这是我使用的代码(它确实崩溃了):
function uc_textcut($var) {
$position = 60;
$result = substr($var,$position,1);
if ($result !=" ") {
while($result !=" ") {
$i = 1;
$position = $position+$i;
$result = substr($var,$position,1);
}
}
$result = substr($var,0,$position);
echo $result;
echo "...";
}
我的问题在于$position = 60
。
该数字越高,所需的负载就越多 - 就像它进行一个非常慢的循环一样。
我认为while()
出了点问题,但是我试图让访问者仍然可以理解这一点,同样,不要在文字中间切入。
任何输入?
:)非常感谢你们
答案 0 :(得分:4)
如果您只想剪切字符串,而不是在单词中间执行,则可以考虑使用wordwrap
函数。
它将返回一个字符串,其中的行由换行符分隔;所以,你必须使用\ n作为分隔符来爆炸该字符串,并获取返回数组的第一个元素。
有关更多信息和/或示例和/或其他解决方案,请参阅:
答案 1 :(得分:0)
$cutoff = 25;
if ($i < $cutoff)
{
echo $str;
}
else
{
// look for a space
$lastSpace = strrchr(substr($str,0,$cutoff)," ");
echo substr($str,0,$lastspace);
echo "...";
}
答案 2 :(得分:0)
这将切断60个字符或60个字符后的第一个空格,与初始代码相同但效率更高:
$position = 60;
if(substr($var,$position,1) == " ") $position = strpos($var," ",$position);
if($position == FALSE) $result = $var;
else $result = substr($var,0,$position);
答案 3 :(得分:0)
$matches = array();
preg_match('/(^.{60,}?) /', $text, $matches);
print_r($matches[1]);
然后,如果需要,你必须添加省略号。
答案 4 :(得分:0)
<?php
// same as phantombrain's but in a function
function uc_textcut($text) {
$matches = array();
preg_match('/(^.{60,}?) /', $text, $matches);
if (isset($matches[1])) {
echo $matches[1] . "...";
} else {
echo $text;
}
}
// test it
$textLong = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed tempus dui non sapien ullamcorper vel tincidunt nisi cursus. Vestibulum ultrices pharetra justo id varius.';
$textShort = 'Lorem ipsum dolor sit amet.';
uc_textcut($textLong);
echo "\n";
uc_textcut($textShort);
&GT;
打印:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed...
Lorem ipsum dolor sit amet.