2009-04-13 28 views
9

Soy bastante nuevo en PHP, y noté que hay muchas maneras diferentes de manejar expresiones regulares.¿Cómo escribo una expresión regular en PHP para eliminar caracteres especiales?

Esto es lo que estoy usando actualmente:

$replace = array(" ",".",",","'","@"); 
$newString = str_replace($replace,"_",$join); 

$join = "the original string i'm parsing through"; 

Quiero eliminar todo lo que no es a-z, A-Z, o 0-9. Estoy buscando una función inversa de la anterior. Una manera de escribir pseudocódigo sería

Si los caracteres en $ unen no son iguales a az, AZ, 0-9 continuación, cambiar los caracteres en $join a "_"

Respuesta

8

La expresión regular para todo lo que no se az, AZ, 0-9 es:

preg_replace('/[^a-zA-Z0-9]/', "_", $join); 

Esto se conoce como un Negated Character Class

33
$newString = preg_replace('/[^a-z0-9]/i', '_', $join); 

Esto debería hacer el truco.

+2

Hola antennen, gracias por la respuesta! ¿es este caso sensible, excepto las mayúsculas? Gracias, Ben. –

+2

Para eso está la 'i' - insensible a mayúsculas y minúsculas. – ceejayoz

+0

tenga en cuenta que esta expresión regular reemplazará las ocurrencias consecutivas de caracteres no alfanuméricos con un solo _. Por lo tanto, '@@@' se reemplazará por '_' no '___'. Quite el + si no desea este comportamiento. – mpen

13

No te estoy dando la respuesta, pero este tutorial bien vale sus 10 minutos.

Link to Regular Expressions in PHP

+0

Gracias CodeToGlory, me aseguraré de verificar esto :) –

+2

Estaba malditamente seguro de que la gente va a votar esto sin revisar el tutorial y la intención detrás de ayudar a esa persona a comprender las expresiones de registro. –

+0

+1 para compensar el downvoting innecesario. no hay nada de malo en esta respuesta – mpen

7

La forma más sencilla es la siguiente:

preg_replace('/\W/', '_', $join); 

\ W es el grupo de caracteres no-palabra. Un carácter de palabra es a-z, A-Z, 0-9 y _. \ W coincide con todo lo que no se mencionó anteriormente *.

Editar: preg usa las expresiones regulares de Perl, documentadas en el documento perlman perlre.

* Editar 2: Esto supone una C o una de las configuraciones regionales en inglés. Otros locales pueden tener letras acentuadas en la clase de caracteres de la palabra. Las configuraciones regionales Unicode solo considerarán que los caracteres que están debajo del punto de código 128 son caracteres.

+0

Debido a la localización, podría contener otros caracteres además de a-z. – runfalk

+0

En realidad, ese es un buen punto.No estoy seguro de cómo PCRE o PHP en particular maneja eso. Veré si puedo encontrar algún documento al respecto. – Powerlord

+0

Encontré esto: http://www.php.net/manual/en/regexp.reference.php Desplácese hacia abajo hasta \ W. – runfalk

Cuestiones relacionadas