2015-06-22 7 views
7

Jeśli chcę dowiedzieć się równowartość szesnastkową przestrzeni w PHP mogę grać z bin2hex:Ile znaków jest widocznych jako spacja, ale czy nie ma znaków spacji?

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

mogę również uzyskać znak spacji z „20”

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

Ale istnieją wersje Unicode "widocznej" przestrzeni:

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

Tak, mogę uzyskać ciąg znaków (na przykład z żądań HTTP), w których nie mogę rozpoznać "nie b" przestrzeń reakcji "moimi oczami. Więc ...

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

Czy istnieje lepszy sposób na znalezienie i zastąpienie wszystkich znaków typu "space like" w PHP?

Odpowiedz

5

Można skorzystać z Unicode category \p{Zs}:

Zs         Kosmicznej separatora

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

\p{Zs} klasa kategoria Unicode dopasuje 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 
+1

To nawet nie będzie pasować do zakładki. – anubhava

+0

@anubhava: Sądziłem, że pytanie dotyczy pasujących symboli * przypominających spacją *, a nie * symboli podobnych do tabulatorów. –

+0

Nie wiesz, jak zdefiniować ** jak w przestrzeni kosmicznej ** Czy powinien zawierać podawanie z podajnikiem, podawanie do linii czy nie? – anubhava

Powiązane problemy