PHP 中的多字节修剪?

2022-08-30 11:48:32

显然,mb_*系列中没有,所以我正试图为自己实现一个。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 空格吗?


答案 1

标准功能会修剪少量空格和类似空格的字符。这些字符被定义为 ASCII 字符,这意味着 从 到 的某些特定字节trim00100 0000

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

这意味着在正确的 UTF-8 序列中,字节只能引用单字节字符。因此,PHP的函数永远不会修剪掉“半个字符”,假设你有一个正确的UTF-8序列。(非常非常小心不正确的 UTF-8 序列。0xxx xxxxtrim


ASCII 上的正则表达式将主要与 相同的字符匹配。\strim

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

如果要替换其他不兼容 ASCII 的编码中的空格字符,则这两种方法都不起作用。

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


当心:

  $s1 = html_entity_decode(" Hello   "); // the NBSP
  $s2 = " 						

答案 2

推荐