首頁  >  問答  >  主體

PHP 修剪 unicode 空格

我正在嘗試修剪諸如此字元之類的 unicode 空格,並且我能夠使用此解決方案來做到這一點。此解決方案的問題是它不會修剪普通字元之間的 unicode 空格。例如這個使用薄空間

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

我對正規表示式有一點了解,所以我不知道要改變我的表達式來解決這個問題

P粉163951336P粉163951336310 天前912

全部回覆(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
  • 取消回覆