我想要做的是基本上缩短一段文字,如果文字太长,最后加上“......”。然而(这里它变得毛茸茸)我只想应用它,如果字符串的最后一个字符是空格。如果它不是空格,那么我想通过字符串(Backwords)直到我找到一个空格,然后当找到空格时我将添加“...”。
对此的推理是我不希望在未完成时将“...”添加到单词中,例如“wor ...”我宁愿它是“单词......”。
这是我到目前为止所尝试的内容(注意:$ row_object_title只是一个来自数据库的字符串,因此可以安全地假设它只是一个随机文本):
if (strlen($row_object_title) > 50){
// check for spaces
$short = substr($row_object_title,50);
$chr = substr($short,-1);
$ascii = ord($chr);
if ($ascii == "32"){
$row_object_title .= "...";
}else{
$x = 49;
while($ascii !== "32"){
$chr = substr($short,$x);
$ascii = ord($chr);
if ($ascii == "32"){
// we got a space!
$row_object_title .= "...";
}
$x = $x - 1;
}
}
}
感谢您的帮助
更新:
if (strlen($row_object_title) > 50){
// check for spaces
$short = substr($row_object_title,50);
$chr = substr($short,-1);
$ascii = ord($chr);
if ($ascii == "32"){
//$trim = "...";
//$final = str_replace($short,$trim,$row_object_title);
$row_object_title .= "...";
}else{
$x = 49;
while($ascii != "32"){
$chr = substr($short,$x,1);
$ascii = ord($chr);
if ($ascii == "32"){
// we got a space!
$row_object_title .= "...";
}
$x = $x - 1;
}
}
}
第二次更新: 每个人都在发布他们的脚本版本(非常感谢),但你们可能会尝试修复我的而不是发布其他方式吗?
答案 0 :(得分:1)
ord()
返回一个整数,但您使用$ascii
检查!==
的值,并将其与字符串进行比较。与!=
相反,!==
仅在操作数类型匹配时才为真。
此外,要从字符串中提取单个字符,请指定子字符串的长度:
$chr = substr($short,$x,1);
您也可以直接索引字符串:$chr = $short{$x}
修改:发现了两个漏洞:
第二行应该是:
$short = substr($row_object_title, 0, 50);
(你错过了长度参数之前的偏移量。)
此外,您将'...'
附加到原始字符串,而不是缩短版本。以下是(希望)更正的脚本的完整版本。
if (strlen($row_object_title) > 50){
// check for spaces
$short = substr($row_object_title,50);
$chr = substr($short,-1);
$ascii = ord($chr);
if ($ascii == 32){
$row_object_title = $short . "...";
}else{
$x = 49;
while($ascii != 32){
$chr = substr($short,$x,1);
$ascii = ord($chr);
if ($ascii == 32){
// we got a space!
$row_object_title = substr($short, 0, $x) . "...";
}
$x = $x - 1;
}
}
}
答案 1 :(得分:0)
我使用以下功能,无法记住我找到它的位置。清除文本中的HTML,并将字符串限制为$limit
个字符,而不会破坏文字。
function show_chopped_text($str, $limit)
{
$regex = "/<\/?\w+((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i";
$strip_html = preg_replace($regex,'',$str);
$rough_short_par = substr($strip_html, 0, $limit);
$last_space_pos = strrpos($rough_short_par, " ");
$clean_short_par = substr($rough_short_par, 0, $last_space_pos);
$clean_sentence = $clean_short_par . "...";
return $clean_sentence;
}
答案 2 :(得分:0)
如果我理解你的问题,这应该可以解决问题:
// if string does *not* end with one or more whitespace characters
if(!preg_match('/\s+$/',$string)) {
// replace everything after last group of one or more whitespaces with '...'
$string = preg_replace('/(.*)\s+.*/','\1...',$string);
}
答案 3 :(得分:0)
$text = "This should just fit in! But if we make it longer, it won't ";
if (strlen($text) > 50) {
$text = substr($text, 0, 50);
for ($i = strlen($text) - 1; $i > 0; $i--) {
if ($text[$i] === ' ' || $text[$i] === ',' || $text[$i] === '.' || $text[$i] === '!' || $text[$i] === '?') {
$text = substr($text, 0, $i) . '... <b>Read More</b>';
break;
}
}
}
我的工作(应该添加RegEx,但我对那些......并不是那么好)。