我的Php截断功能有问题......
我的代码是:
// truncate long word
$textArray = explode ( " ", $text );
$DEBUG = 1;
if ($DEBUG == 1) {
print_r("// truncate long word");
print_r($textArray);
print_r("// END truncate long word");
print_r("<br>");
}
foreach ( $textArray as $key => $word ) {
if (mb_strlen ($word) > $wordsLenght) {
$truncatedWord = mb_substr ($word, 0, $wordsLenght);
$textArray [$key] = $truncatedWord . "[...]";
}
}
假设,例如,输入字符串是这个“cia ???☺☻♥♀♂☼•◘○♠♣xas ????? !!!! ----”(没有引号)这个是我的结果打印为print_r:
// truncate long wordArray
(
[0] => cia???☺☻♥♀♂☼•◘○♠♣xas?????!!!!----
)
// END truncate long word
Result ($textArray)
(
[0] => cia???☺☻♥♀��[...]
)
正如您所看到的,字符串被错误地终止,可能是由什么造成的?
答案 0 :(得分:0)
基于标题,在终端中使用ASCI转义序列时,此问题变得最严重。
这是战斗的结局,使用php-mbstring。
mb_strcut()从字符串中提取子字符串,类似于 mb_substr(),但对字节而不是字符进行操作。如果切 位置恰好在多字节字符的两个字节之间, 从该字符的第一个字节开始执行剪切。 这也是与substr()函数的区别, 只是在字节之间剪切字符串,从而导致格式错误 字节序列。
例如,以下函数将以给定的长度通过ANSI红星*
截断字符串。
这对双方都有效,输入字符串可以包含ASCI序列和unicode,输出也可以包含一些用于标记。
<?php
function truncateASCI($me, $at, $by = "*"){
$l = mb_strlen($me);
$t = mb_strcut($me,0,$at/2);
$r = mb_strcut($me,$at/2, $l - $at);
$me = str_replace($t,rtrim($t),str_replace($r, "\033[31;1m".$by."\e[0m", $me));
return $me;
}
/* Examples */
echo truncateASCI("Screenshot at 2019-09-09 02-36-46.png",8);
echo "\n";
echo truncateASCI("Screenshot \033[1mat 2019-09-09\e[0m 02-36-46Super_long_string_with ansi_escape_sequences.png",8);
echo "\n";
echo truncateASCI("Screenshot \033[1mat 2019-09-09\e[0m 02-36-46Super_long_string_with ansi_escape_sequences.png",24);
/* Output an ASCI red star. No breaking */
Scre[31;1m*[0m.png
Scre[31;1m*[0m.png
Screenshot [31;1m*[0mequences.png