web-dev-qa-db-fra.com

Comment supprimer des caractères non alphanumériques?

Je dois supprimer tous les caractères d'une chaîne qui ne font pas partie de a-z A-Z 0-9 ou ne sont pas des espaces.

Quelqu'un at-il une fonction pour faire cela?

298
zuk1

On dirait que vous saviez presque ce que vous vouliez déjà faire, vous l'avez essentiellement défini comme une regex.

preg_replace("/[^A-Za-z0-9 ]/", '', $string);
618
Chad Birch

Pour les caractères unicode, c'est:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
146
voondo

Expression régulière est votre réponse. 

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • i signifie non sensible à la casse. 
  • ^ signifie, ne commence pas par. 
  • \d correspond à n'importe quel chiffre. 
  • a-z correspond à tous les caractères compris entre a et z. En raison du paramètre i, vous n'avez pas à spécifier a-z et A-Z
  • Après \d, il y a un espace; les espaces sont donc autorisés dans cette expression rationnelle.
44
raspi

voici une regex très simple pour cela:

\W|_

et utilisé selon vos besoins (avec un délimiteur de barre oblique /).

preg_replace("/\W|_/", '', $string);

Testez-le ici avec cet excellent outil qui explique ce que fait la regex:

http://www.regexr.com/

16
Alex Stephens
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

Il sélectionne tous les éléments non AZ, AZ, 0-9 et le supprime.

Voir exemple ici: https://regexr.com/3h1rj

4
Intacto
preg_replace("/\W+/", '', $string)

Vous pouvez le tester ici: http://regexr.com/

2
DOZ

Si vous devez prendre en charge d'autres langues, vous pouvez utiliser les éléments suivants à la place de A à Z typique:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ] définit un negated (il correspond à un caractère qui est pas défini).
    • \p{L}: une lettre de la langue n’importe laquelle.
    • \p{N}: un caractère numérique dans le script any.
    • : un espace.
  • +greedily correspond à la classe de caractères entre 1 et unlimited fois.

Cela préservera les lettres et les chiffres d'autres langues et scripts, ainsi que de A à Z:

preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

Note: C'est une question très ancienne, mais toujours pertinente. Je réponds simplement pour fournir des informations supplémentaires qui pourraient être utiles aux futurs visiteurs.

2
Jonathon

Je cherchais la réponse aussi et mon intention était de nettoyer chaque non-alpha et il ne devrait pas y avoir plus d'un espace .
Donc, j'ai modifié la réponse d'Alex à ceci, et cela fonctionne pour moi preg_replace('/[^a-z|\s+]+/i', ' ', $name)
La regex ci-dessus a transformé sy8ed sirajul7_islam en sy ed sirajul islam
Explication: regex vérifiera PAS AUCUN de a à z en cas insensible manière ou plusieurs espaces, et sera converti en un seul espace.

0
ssi-anik

Vous pouvez diviser la chaîne en caractères et la filtrer.

<?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

?>
0
zekel