Réponses:
On dirait que vous saviez presque déjà ce que vous vouliez faire, vous l'avez essentiellement défini comme une expression régulière.
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
Pour les caractères unicode, c'est:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
inclut \d
et donc le \d
n'est pas nécessaire. En outre, cela est faux car cela laissera également des traits de soulignement dans la chaîne résultante (qui est également incluse dans \w
).
i
drapeau est-il vraiment nécessaire ici puisqu'il [:alnum:]
couvre déjà les deux cas?
L'expression régulière est votre réponse.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
signifie insensible à la casse.^
signifie, ne commence pas par. \d
correspond à n'importe quel chiffre. a-z
correspond à tous les caractères entre a
et z
. En raison du i
paramètre, vous n'avez pas besoin de spécifier a-z
et A-Z
.\d
qu'il y ait un espace, les espaces sont donc autorisés dans cette expression régulière.voici un regex vraiment 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 l'expression régulière:
/u
drapeau, sinon les lettres non ascii sont également supprimées.
[\W_]+
Si vous devez prendre en charge d'autres langues, au lieu de l'AZ classique, vous pouvez utiliser les éléments suivants:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
définit une classe de caractères négée (elle correspondra à un caractère non défini) de:
\p{L}
: une lettre de n'importe quelle langue.\p{N}
: un caractère numérique dans n'importe quel script.
: un caractère spatial.+
avidement correspond à la classe de caractères entre 1 et un nombre illimité de fois.Cela préservera les lettres et les chiffres d'autres langues et scripts ainsi que 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} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
Remarque: Il s'agit d'une question très ancienne, mais toujours pertinente. Je réponds uniquement pour fournir des informations supplémentaires qui pourraient être utiles aux futurs visiteurs.
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
Il sélectionne tout non AZ, az, 0-9 et le supprime.
Voir l'exemple ici: https://regexr.com/3h1rj
\W
est l'inverse \w
dont sont les caractères A-Za-z0-9_
. Il \W
correspondra donc à tout caractère qui ne l'est pas A-Za-z0-9_
et les supprimera. La []
est une limite de jeu de caractères . Le +
est redondant sur une limite de jeu de caractères mais signifie normalement 1 ou plusieurs caractères. L' u
indicateur étend l'expression pour inclure la prise en charge des caractères unicode, ce qui signifie qu'il ne supprimera pas les caractères au-delà du code de caractère 255 tel que ª²³µ
. Exemple d'utilisations diverses 3v4l.org/hSVV5 avec des caractères unicode et ascii.
preg_replace("/\W+/", '', $string)
Vous pouvez le tester ici: http://regexr.com/
Je cherchais aussi la réponse 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 à cela, et cela fonctionne pour moi
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
Le regex ci-dessus s'est transformé sy8ed sirajul7_islam
en sy ed sirajul islam
Explication: regex ne vérifiera PAS DE A à Z en cas de manière insensible ou plus d'un espace blanc, et il 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
?>
preg_replace()
appel simple et simple .