有多少个字符像空格一样可见,但不是空格字符?

sen*_*rio 7 php regex

如果我想在PHP中发现空格的十六进制等效,我可以使用bin2hex:

php > echo var_dump(bin2hex(" "));
string(2) "20"
Run Code Online (Sandbox Code Playgroud)

我也可以从"20"获得空间角色

php > echo var_dump(hex2bin("20"));
string(1) " "
Run Code Online (Sandbox Code Playgroud)

但是存在"可见"空间的Unicode版本:

php > echo var_dump(hex2bin('c2a0'));
string(2) " "
Run Code Online (Sandbox Code Playgroud)

所以,我可以得到一些字符串(例如来自HTTP请求),我无法用眼睛识别出"没有休息空间".所以......

$string = preg_replace('~\x{00a0}~siu', ' ', $string);
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来查找和替换PHP中的所有"空格"字符?

Wik*_*żew 6

您可以使用Unicode类别\p{Zs}:

Zs    空间分隔符

$string = preg_replace('~\p{Zs}~u', ' ', $string);
Run Code Online (Sandbox Code Playgroud)

\p{Zs}Unicode的类别类将匹配这些空间类符号:

Character   Name
U+0020      SPACE
U+00A0      NO-BREAK SPACE
U+1680      OGHAM SPACE MARK
U+2000      EN QUAD
U+2001      EM QUAD
U+2002      EN SPACE
U+2003      EM SPACE
U+2004      THREE-PER-EM SPACE
U+2005      FOUR-PER-EM SPACE
U+2006      SIX-PER-EM SPACE
U+2007      FIGURE SPACE
U+2008      PUNCTUATION SPACE
U+2009      THIN SPACE
U+200A      HAIR SPACE
U+202F      NARROW NO-BREAK SPACE
U+205F      MEDIUM MATHEMATICAL SPACE
U+3000      IDEOGRAPHIC SPACE
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,如果您*确实*需要匹配制表符,`\s` 将在 utf-8 模式(“u”修饰符)下匹配所有这些加制表符和垂直制表符。 (2认同)