2010-11-17 13 views
6

Estoy tratando de eliminar todo lo que no es alfanumérico, o es un espacio con _:espacios Extracción y todo lo que no es alfanumérico

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

¿Qué estoy haciendo mal aquí, no parece que trabajo. Probé varias combinaciones de expresiones regulares ... (y en general no soy muy brillante).

+0

estoy confused-- ligeramente ¿Quieres reemplazar espacios con "_" o no? – climbage

+0

Bueno, por un lado has logrado descuidar algunos caracteres: ''unichars -a '[\ p {Alpha} \ p {Number}]' '[^ a-zA-Z0-9]' | wc -l' == 14717'. No es un buen lugar para comenzar. – tchrist

+0

Debe poner '' s 'entre corchetes. De lo contrario, '^ \ s' coincide con espacios en blanco al inicio'^'del tema. También use '/../' para encerrar, los corchetes son solo para capturar. – mario

Respuesta

11

Prueba esto:

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

Sugiero contabilizar los otros casi 15000 caracteres que olvidaste. – tchrist

+0

Regex no considera caracteres válidos Unicode – stillstanding

0

Trate

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

Wow. Um, ¿cómo es que '\ s' está haciendo * fuera * de la clase de personaje? ¿Y qué hay de los miles de alfanuméricos que olvidaste, eh? – tchrist

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

Si entiendo bien su pregunta, que desea reemplazar cualquier espacio (\ s) o no alfanumérico (\ W) personaje con un '_'. Esto debería estar bien. Tenga en cuenta que \ W es mayúscula, en oposición a minúscula \ w, que coincidiría con caracteres alfanuméricos.

+2

El significado de '\ W' varía de un sabor a otro, pero en PHP coincide con cualquier carácter que no sea un carácter de palabra ASCII, es decir' [A-Za-z0-9_] '. Eso incluye caracteres ASCII de espacio en blanco (por lo que '\ s' es redundante) y caracteres alfanuméricos de otros scripts. Incluso las letras latinas acentuadas se consideran caracteres sin palabras por '\ W'. –

2

La solución que funcione para mí es:

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

Los partidos + bloques de una o más ocurrencias de \W espacios en blanco que incluye espacios y todos los caracteres no alfanuméricos

Cuestiones relacionadas