J'ai besoin de supprimer tous les caractères d'une chaîne qui ne sont pas dans l' a-z A-Z 0-9
ensemble ou qui ne sont pas des espaces.
Quelqu'un at-il une fonction pour le faire?
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:
la source
\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.
i
signifie insensible à la casse.^
signifie, ne commence pas par.\d
correspond à n'importe quel chiffre.a-z
correspond à tous les caractères entrea
etz
. En raison dui
paramètre, vous n'avez pas besoin de spécifiera-z
etA-Z
.\d
qu'il y ait un espace, les espaces sont donc autorisés dans cette expression régulière.la source
voici un regex vraiment simple pour cela:
et utilisé selon vos besoins (avec un
/
délimiteur de barre oblique).Testez-le ici avec cet excellent outil qui explique ce que fait l'expression régulière:
http://www.regexr.com/
la source
/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:
[^\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:
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.
la source
Il sélectionne tout non AZ, az, 0-9 et le supprime.
Voir l'exemple ici: https://regexr.com/3h1rj
la source
\W
est l'inverse\w
dont sont les caractèresA-Za-z0-9_
. Il\W
correspondra donc à tout caractère qui ne l'est pasA-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.Vous pouvez le tester ici: http://regexr.com/
la source
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
ensy 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.
la source
Vous pouvez diviser la chaîne en caractères et la filtrer.
la source
preg_replace()
appel simple et simple .