Php截断与ascii符号

时间:2016-12-05 09:24:50

标签: php arrays truncate

我的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???☺☻♥♀��[...]
    )

正如您所看到的,字符串被错误地终止,可能是由什么造成的?

1 个答案:

答案 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

Truncate_ASCI

在线运行:https://3v4l.org/2nJla