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);
\w
inclui \d
e 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
).
i
bandeira é 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);
i
significado de maiúsculas e minúsculas.^
significa, não começa com. \d
corresponde a qualquer dígito. a-z
corresponde a todos os caracteres entre a
e z
. Por causa do i
parâmetro, você não precisa especificar a-z
e A-Z
.\d
haver 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:
/u
bandeira, 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 \w
quais 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 u
sinalizador 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_islam
para 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 .