2010-11-17 11 views
6

Sto cercando di rimuovere tutto ciò che non è alfanumerico, o è uno spazio con _:Rimozione spazi e tutto ciò che non è alfanumerico

$filename = preg_replace("([^a-zA-Z0-9]|^\s)", "_", $filename); 

Che cosa sto facendo di sbagliato qui, non sembra lavoro. Ho provato diverse combinazioni di regex ... (e generalmente non sono molto brillante).

+0

Sono un po 'confused-- vuoi sostituire gli spazi con "_" o no? – climbage

+0

Bene, per una cosa sei riuscito a trascurare alcuni caratteri: ''unichars -a '[\ p {Alpha} \ p {numero}]' '[^ a-zA-Z0-9]' | wc -l '== 14717'. Non è un buon punto di partenza. – tchrist

+0

Dovresti inserire '\ s' nelle parentesi quadre. Altrimenti '^ \ s' corrisponde agli spazi bianchi all'inizio'^'del soggetto. Usa anche '/../' per racchiudere, le parentesi tonde servono solo per catturare. – mario

risposta

11

Prova questo:

$filename = preg_replace("/[^a-zA-Z0-9 ]/", "_", $filename); 
+1

Suggerisco di tenere conto degli altri quasi 15000 caratteri che hai dimenticato. – tchrist

+0

Regex non considera i caratteri Unicode validi – stillstanding

0

Prova

$filename = preg_replace("/[a-zA-Z0-9]|\s/", "_", $filename); 
+0

Wow. Um, come sta andando a fare * fuori * la classe del personaggio? E le migliaia di alfanumerici che hai dimenticato, eh? – tchrist

7
$filename = preg_replace('~[\W\s]~', '_', $filename); 

Se ho capito la tua domanda correttamente, si desidera sostituire qualsiasi spazio (\ s) o non-alfanumerico (\ W) personaggio con un '_'. Questo dovrebbe andare bene. Notare che \ W è maiuscolo, al contrario di \ w minuscolo che corrisponderebbe ai caratteri alfanumerici.

+2

Il significato di '\ W' varia da un gusto all'altro, ma in PHP corrisponde a qualsiasi carattere che non sia un carattere di parola ASCII, ad esempio' [A-Za-z0-9_] '. Ciò include i caratteri degli spazi bianchi ASCII (quindi '\ s' è ridondante) e i caratteri alfanumerici di altri script. Anche le lettere latine accentate sono considerate caratteri non parole di '\ W'. –

2

La soluzione che funziona per me è:

$filename = preg_replace('/\W+/', '_', $filename); 

I + partite blocchi di una o più occorrenze di \W spazio bianco che comprende spazi e tutti i caratteri non alfanumerici

Problemi correlati