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?
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);
Pour les caractères unicode, c'est:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
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
. \d
, il y a un espace; les espaces sont donc autorisés dans cette expression rationnelle.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:
[\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
preg_replace("/\W+/", '', $string)
Vous pouvez le tester ici: http://regexr.com/
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.
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.
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
?>