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

时间:2015-06-22 12:54:48

标签: php regex

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

php > echo var_dump(bin2hex(" "));
string(2) "20"

我也可以从“20”获得空格字符

php > echo var_dump(hex2bin("20"));
string(1) " "

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

php > echo var_dump(hex2bin('c2a0'));
string(2) " "

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

$string = preg_replace('~\x{00a0}~siu', ' ', $string);

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

1 个答案:

答案 0 :(得分:6)

您可以使用Unicode category \p{Zs}

  

Zs空格分隔符

$string = preg_replace('~\p{Zs}~u', ' ', $string);

\p{Zs} Unicode类别类将匹配these space-like symbols

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