gpt4 book ai didi

php - PHP中的多字节修剪?

转载 作者:IT王子 更新时间:2023-10-29 01:06:49 24 4
gpt4 key购买 nike

显然 mb_* family 中没有 mb_trim ,所以我正在尝试自己实现一个。

我最近在 php.net 的评论中发现了这个正则表达式:

/(^\s+)|(\s+$)/u

所以,我将按以下方式实现它:

function multibyte_trim($str)
{
if (!function_exists("mb_trim") || !extension_loaded("mbstring")) {
return preg_replace("/(^\s+)|(\s+$)/u", "", $str);
} else {
return mb_trim($str);
}
}

正则表达式对我来说似乎是正确的,但我对正则表达式非常菜鸟。这会有效地删除字符串开头/结尾的任何 Unicode 空格吗?

最佳答案

标准的 trim 函数会修剪一些空格和类似空格的字符。这些被定义为 ASCII 字符,这意味着从 00100 0000 的某些特定字节

正确 UTF-8 输入永远不会包含由字节 0xxx xxxx 组成的多字节字符。 正确 UTF-8 多字节字符中的所有字节都以1xxx xxxx 开头。

这意味着在正确 UTF-8 序列中,字节0xxx xxxx 只能指代单字节字符。因此,PHP 的 trim 函数永远不会修剪掉“半个字符”假设您有一个正确 UTF-8 序列。 (非常非常careful about improper UTF-8 sequences。)


ASCII 正则表达式中的 \s 将主要匹配与 trim 相同的字符。

带有 /u 修饰符的 preg 函数仅适用于 UTF-8 编码的正则表达式,而 /\s/u 也匹配 UTF8 的 nbsp .这种不间断空格的行为是使用它的唯一优势。

如果您想用其他不兼容 ASCII 的编码替换空格字符,这两种方法都行不通。

换句话说,如果您尝试修剪 ASCII 兼容字符串中的常用空格,只需使用 trim。使用 /\s/u 时,请注意文本中 nbsp 的含义。


保重:

  $s1 = html_entity_decode(" Hello   "); // the NBSP
$s2 = " 𩸽 exotic test ホ 𩸽 ";

echo "\nCORRECT trim: [". trim($s1) ."], [". trim($s2) ."]";
echo "\nSAME: [". trim($s1) ."] == [". preg_replace('/^\s+|\s+$/','',$s1) ."]";
echo "\nBUT: [". trim($s1) ."] != [". preg_replace('/^\s+|\s+$/u','',$s1) ."]";

echo "\n!INCORRECT trim: [". trim($s2,'𩸽 ') ."]"; // DANGER! not UTF8 safe!
echo "\nSAFE ONLY WITH preg: [".
preg_replace('/^[𩸽\s]+|[𩸽\s]+$/u', '', $s2) ."]";

关于php - PHP中的多字节修剪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10066647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com