2015-06-22 15 views
7

Se voglio scoprire l'equivalente esadecimale di uno spazio in PHP posso giocare con bin2hex:Quanti caratteri sono visibili come uno spazio, ma i caratteri spazio arent?

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

posso ottenere anche carattere di spazio da "20"

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

Ma esistono versioni Unicode di uno spazio "visibile":

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

Quindi, posso ottenere qualche stringa (per esempio da richieste HTTP) in cui non posso riconoscere il "no b spazio insolito "con i miei occhi. Quindi, ...

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

C'è un modo migliore per trovare e sostituire tutti i caratteri di "spazio come" in PHP?

risposta

5

si può fare uso di un Unicode category \p{Zs}: separatore di spazio

Zs        

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

Il \p{Zs} Unicode classe di categoria corrisponderà 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

Non corrisponde nemmeno a una scheda – anubhava

+0

@anubhava: ho pensato che la domanda riguardasse la corrispondenza di simboli * simili a quelli dello spazio *, non * simboli tab-like *. –

+0

Non sai come definire un ** di tipo spazio ** Dovrebbe includere la formfeed, Linefeed o no? – anubhava

Problemi correlati