Respostas:
Parece que você quase sabia o que queria fazer, basicamente o definiu como um regex.
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
Para caracteres unicode, é:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\winclui \de assim o \dé desnecessário. Além disso, isso está errado porque também deixará sublinhados na string resultante (que também está incluída em \w).
ibandeira é realmente necessária aqui, já que [:alnum:]já abrange os dois casos?
Expressão regular é a sua resposta.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
isignificado de maiúsculas e minúsculas.^ significa, não começa com. \d corresponde a qualquer dígito. a-zcorresponde a todos os caracteres entre ae z. Por causa do iparâmetro, você não precisa especificar a-ze A-Z.\dhaver um espaço, os espaços são permitidos nesse regex.aqui está um regex realmente simples para isso:
\W|_
e usado conforme necessário (com um /delimitador de barra).
preg_replace("/\W|_/", '', $string);
Teste aqui com esta ótima ferramenta que explica o que a regex está fazendo:
/ubandeira, caso contrário, as letras não-ascii também serão removidas.
[\W_]+
Se você precisar oferecer suporte a outros idiomas, em vez do AZ típico, use o seguinte:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]define uma classe de caracteres negada (corresponderá a um caractere que não está definido) de:
\p{L}: uma carta de qualquer idioma.\p{N}: um caractere numérico em qualquer script.: um caractere de espaço.+ avidamente corresponde à classe de personagem entre 1 e vezes ilimitadas .Isso preservará letras e números de outros idiomas e scripts, além do 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: Essa é uma pergunta muito antiga, mas ainda relevante. Estou respondendo apenas para fornecer informações adicionais que possam ser úteis para futuros visitantes.
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
Ele seleciona nem todos AZ, az, 0-9 e o exclui.
Veja o exemplo aqui: https://regexr.com/3h1rj
\Wé o inverso dos \wquais são caracteres A-Za-z0-9_. Portanto \W, corresponderá a qualquer caractere que não seja A-Za-z0-9_e os removerá. O []é um limite do conjunto de caracteres . A +é redundante em um limite de conjunto de caracteres, mas normalmente significa 1 ou mais caracteres. O usinalizador expande a expressão para incluir suporte a caracteres unicode, o que significa que não removerá caracteres além do código de caracteres 255, como ª²³µ. Exemplo de vários usos 3v4l.org/hSVV5 com caracteres unicode e ascii.
preg_replace("/\W+/", '', $string)
Você pode testá-lo aqui: http://regexr.com/
Eu também estava procurando a resposta e minha intenção era limpar todos os não-alfa e não deveria haver mais de um espaço.
Então, eu modifiquei a resposta de Alex para isso, e isso está funcionando para mim
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
O regex acima virou sy8ed sirajul7_islampara sy ed sirajul islam
Explicação: regex irá verificar Não é qualquer de A a Z no caso insensível maneira ou de mais de um espaços em branco, e ele será convertido em um único espaço.
Você pode dividir a sequência em caracteres e filtrá-la.
<?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()chamada simples e simples .