suchen

Heim  >  Fragen und Antworten  >  Hauptteil

PHP schneidet Unicode-Leerzeichen ab

Ich versuche, Unicode-Leerzeichen wie dieses Zeichen zu kürzen, und das ist mir mit dieser Lösung gelungen. Das Problem bei dieser Lösung besteht darin, dass Unicode-Leerzeichen zwischen normalen Zeichen nicht entfernt werden. Hier wird zum Beispiel Thin Space verwendet

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

Ich kenne mich ein wenig mit regulären Ausdrücken aus, daher weiß ich nicht, was ich an meinem Ausdruck ändern soll, um dieses Problem zu lösen

P粉163951336P粉163951336384 Tage vor1042

Antworte allen(2)Ich werde antworten

  • 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
    

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

    Antwort
    0
  • StornierenAntwort