(从与 NBSP 斗争的重复 Q 中移植trim
。)以下注释自 PHP 7.2+ 起有效。里程可能会因早期版本而异(请在评论中报告)。
PHPtrim
忽略不间断的空格。它只修剪基本 ASCII 范围内的空格。作为参考, trim的源代码如下所示(即,没有带有 trim 的未记录功能):
(c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')
以上,除了普通的空格(ASCII 32,
)外,都是ASCII控制字符;LF (10: \n
), CR (13: \r
), HT (9: \t
), VT (11: \v
), NUL (0: \0
)。(请注意,在 PHP 中,您必须将转义字符用双引号括起来:"\n", "\t"
等等。否则它们将被解析为文字\n
等。)
以下是使用Unicode 字符串的trim
( ltrim
, rtrim
, trim
)三种风格的简单实现:preg_replace
preg_replace('~^\s+~u', '', $string) // == ltrim
preg_replace('~\s+$~u', '', $string) // == rtrim
preg_replace('~^\s+|\s+$~us', '', $string) // == trim
随意将它们包装到您自己的mb_*trim
函数中。
根据PCRE 规范,开启 Unicode 模式的\s
“任何空格”转义序列字符u
将匹配以下所有空格字符:
The horizontal space characters are:
U+0009 Horizontal tab (HT)
U+0020 Space
U+00A0 Non-break space
U+1680 Ogham space mark
U+180E Mongolian vowel separator
U+2000 En quad
U+2001 Em quad
U+2002 En space
U+2003 Em space
U+2004 Three-per-em space
U+2005 Four-per-em space
U+2006 Six-per-em space
U+2007 Figure space
U+2008 Punctuation space
U+2009 Thin space
U+200A Hair space
U+202F Narrow no-break space
U+205F Medium mathematical space
U+3000 Ideographic space
The vertical space characters are:
U+000A Linefeed (LF)
U+000B Vertical tab (VT)
U+000C Form feed (FF)
U+000D Carriage return (CR)
U+0085 Next line (NEL)
U+2028 Line separator
U+2029 Paragraph separator
您可以看到使用Unicode 标志处理所有列出的空格的测试迭代。按照 PCRE 规范,它们都按预期进行了修剪。如果您只针对上面的水平空间,将匹配它们,就像所有垂直空间一样。preg_replace
u
\h
\v
在某些答案中使用\p{Z}
seen 在某些方面会失败;具体来说,使用了大部分 ASCII 空格,令人震惊的是,还使用了蒙古元音分隔符。忽必烈会大怒。以下是未命中的列表\p{Z}
: U+0009水平制表符 (HT)、 U+000A换行 (LF)、 U+000C换页 (FF)、 U+000D回车 (CR)、 U+0085下一行 (NEL) , 和 U+180E蒙古语元音分隔符。
至于为什么会发生这种情况,上面的 PCRE 规范还指出:“\s
任何匹配\p{Z}
or \h
or\v
的字符”。也就是说,\s
是 的超集\p{Z}
。然后,只需使用\s
. \p{Z}
它更全面,对于阅读您的代码的人来说,导入更明显,他们可能不记得所有字符类型的矮个子。