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);
\wincluye \dy por lo tanto \des innecesario. Además, esto está mal porque también dejará guiones bajos en la cadena resultante (que también se incluye en \w).
irealmente 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);
isoportes para mayúsculas y minúsculas.^ significa, no comienza con. \d coincide con cualquier dígito. a-zcoincide con todos los caracteres entre ay z. Debido al iparámetro que no tiene que especificar a-zy A-Z.\dhaya 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:
/ubandera; 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
\Wes el inverso de los \wcuales son los caracteres A-Za-z0-9_. Entonces \Wcoincidirá 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 uindicador 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_islamen 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 .