搜索

首页  >  问答  >  正文

PHP 修剪 unicode 空格

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

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

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

P粉163951336P粉163951336384 天前1041

全部回复(2)我来回复

  • P粉557957970

    P粉5579579702023-11-14 00:59:08

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

    回复
    0
  • P粉445750942

    P粉4457509422023-11-14 00:22:00

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

    回复
    0
  • 取消回复