Respuestas:
Parece que ya casi sabías lo que querías hacer, básicamente lo definiste como una expresión regular.
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
Para los caracteres unicode, es:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
incluye \d
y por lo tanto \d
es innecesario. Además, esto está mal porque también dejará guiones bajos en la cadena resultante (que también se incluye en \w
).
i
realmente necesaria la bandera aquí [:alnum:]
ya que cubre ambos casos?
La expresión regular es tu respuesta.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
soportes para mayúsculas y minúsculas.^
significa, no comienza con. \d
coincide con cualquier dígito. a-z
coincide con todos los caracteres entre a
y z
. Debido al i
parámetro que no tiene que especificar a-z
y A-Z
.\d
haya un espacio, se permiten espacios en esta expresión regular.Aquí hay una expresión regular realmente simple para eso:
\W|_
y se usa según lo necesite (con un /
delimitador de barra diagonal).
preg_replace("/\W|_/", '', $string);
Pruébelo aquí con esta gran herramienta que explica lo que está haciendo la expresión regular:
/u
bandera; de lo contrario, también se eliminarán las letras que no sean ascii.
[\W_]+
Si necesita admitir otros idiomas, en lugar del AZ típico, puede usar lo siguiente:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
define una clase de caracteres negada (coincidirá con un carácter que no está definido) de:
\p{L}
: una carta de cualquier idioma.\p{N}
: un carácter numérico en cualquier script.
: un personaje espacial.+
codiciosamente coincide con la clase de personaje entre 1 e ilimitado veces.Esto preservará letras y números de otros idiomas y scripts, así como de AZ:
preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
Nota: Esta es una pregunta muy antigua, pero aún relevante. Estoy respondiendo únicamente para proporcionar información complementaria que pueda ser útil para futuros visitantes.
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
Selecciona todo, no AZ, az, 0-9 y lo elimina.
Ver ejemplo aquí: https://regexr.com/3h1rj
\W
es el inverso de los \w
cuales son los caracteres A-Za-z0-9_
. Entonces \W
coincidirá con cualquier personaje que no lo sea A-Za-z0-9_
y los eliminará. El []
es un límite de juego de caracteres . El +
es redundante en un límite de juego de caracteres, pero normalmente significa 1 o más caracteres. El u
indicador expande la expresión para incluir compatibilidad con caracteres unicode, lo que significa que no eliminará caracteres más allá del código de caracteres 255 como ª²³µ
. Ejemplo de varios usos 3v4l.org/hSVV5 con caracteres unicode y ascii.
preg_replace("/\W+/", '', $string)
Puedes probarlo aquí: http://regexr.com/
Estaba buscando la respuesta también y mi intención era limpiar cada no alfa y no debería tener más de un espacio.
Entonces, modifiqué la respuesta de Alex a esto, y esto está funcionando para mí.
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
La expresión regular anterior se convirtió sy8ed sirajul7_islam
en sy ed sirajul islam
Explicación: la expresión regular verificará NO CUALQUIERA de la a a la z en caso de que sea insensible o más de un espacio en blanco, y se convertirá en un solo espacio.
Puede dividir la cadena en caracteres y filtrarla.
<?php
function filter_alphanum($string) {
$characters = str_split($string);
$alphaNumeric = array_filter($characters,"ctype_alnum");
return join($alphaNumeric);
}
$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123
?>
preg_replace()
llamada simple y simple .