PHP 修剪 unicode 空格
P粉163951336
P粉163951336 2023-11-13 08:49:45
0
2
1058

我正在尝试修剪诸如此字符之类的 unicode 空格,并且我能够使用此解决方案来做到这一点。此解决方案的问题是它不会修剪普通字符之间的 unicode 空格。例如这个使用薄空间

$string = "   test   string   ";
echo preg_replace('/^[pZpC]+|[pZpC]+$/u', '', $string);
// outputs: test   string

我对正则表达式有一点了解,所以我不知道要改变我的表达式来解决这个问题

P粉163951336
P粉163951336

全部回复(2)
P粉557957970

要删除字符串开头和结尾处的所有带有控制字符的 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]

查看 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
P粉445750942

这样的 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); 来表示的。从此类实现。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板