用ascii符号截短的Php

问题描述 投票:2回答:1

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

您可以看到字符串错误地终止了,这可能是由什么引起的?

php arrays truncate
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.