Heim > Fragen und Antworten > Hauptteil
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粉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
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); 来表示的。从此类实现。