我正在尝试修剪诸如此字符之类的 unicode 空格,并且我能够使用此解决方案来做到这一点。此解决方案的问题是它不会修剪普通字符之间的 unicode 空格。例如这个使用薄空间
$string = " test string "; echo preg_replace('/^[pZpC]+|[pZpC]+$/u', '', $string); // outputs: test string
我对正则表达式有一点了解,所以我不知道要改变我的表达式来解决这个问题
要删除字符串开头和结尾处的所有带有控制字符的 Unicode 空白,以及删除字符串内任何位置除常规空格之外的所有带有控制字符的 Unicode 空白,您可以使用
preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$|(?! )[\pZ\pC]/u', '', $string) // Or, simply preg_replace('/^\s+|\s+$|[^\S ]/u', '', $string)
请参阅正则表达式演示 #1 和正则表达式 演示 #2。
详细信息
^[\pZ\pC]+
|
[\pZ\pC]+$
(?! )[\pZ\pC]
[^\S ]
\x20
如果您还需要“排除”常见换行符,请将 (?! )[\pZ\pC] 替换为 (?![ \r\n])[ \pZ\pC] (由 @MonkeyZeus 建议) ,在第二个正则表达式中,这意味着您需要使用 [^\S \r\n]。
(?![ \r\n])[ \pZ\pC]
[^\S \r\n]
查看 PHP 演示:
echo preg_replace('~^[\pZ\pC]+|[\pZ\pC]+$|(?! )[\pZ\pC]~u', '', 'abc def ghi '); // => abc defghi echo preg_replace('/^\s+|\s+$|[^\S ]/u', '', 'abc def ghi '); // => abc defghi
这样的 Unicode 空格 \u{2009} 如何在不同的地方引起问题。 因此,我会将所有 unicode 空格替换为常规空格,然后应用 trim()。
$string = " test string and XY \t "; //\u{2009}\u{2009}\u{2009}test\u{2009}\u{2009}\u{2009}string\u{2009}and\x20XY\x20\x09\u{2009} $trimString = trim(preg_replace('/[\pZ\pC]/u', ' ', $string)); //test\x20\x20\x20string\x20and\x20XY
注意:注释中字符串的表示是用 debug::writeUni($string, $trimString); 来表示的。从此类实现。
要删除字符串开头和结尾处的所有带有控制字符的 Unicode 空白,以及删除字符串内任何位置除常规空格之外的所有带有控制字符的 Unicode 空白,您可以使用
请参阅正则表达式演示 #1 和正则表达式 演示 #2。
详细信息
^[\pZ\pC]+
- 字符串开头的一个或多个空格或控制字符|
- 或[\pZ\pC]+$
- 字符串末尾的一个或多个空格或控制字符|
- 或(?! )[\pZ\pC]
- 字符串内任意位置除常规空格之外的一个或多个空格或控制字符[^\S ]
- 除常规空格 (\x20
) 之外的任何空格如果您还需要“排除”常见换行符,请将
(?! )[\pZ\pC]
替换为(?![ \r\n])[ \pZ\pC]
(由 @MonkeyZeus 建议) ,在第二个正则表达式中,这意味着您需要使用[^\S \r\n]
。查看 PHP 演示:
这样的 Unicode 空格 \u{2009} 如何在不同的地方引起问题。 因此,我会将所有 unicode 空格替换为常规空格,然后应用 trim()。
注意:注释中字符串的表示是用 debug::writeUni($string, $trimString); 来表示的。从此类实现。