Fonction pour renvoyer uniquement les caractères alphanumériques de la chaîne?

98

Je recherche une fonction php qui prendra une chaîne d'entrée et en retournera une version nettoyée en supprimant tous les caractères spéciaux ne laissant que des caractères alphanumériques.

J'ai besoin d'une deuxième fonction qui fait la même chose mais ne renvoie que les caractères alphabétiques AZ.

Toute aide très appréciée.

Scott B
la source
Dans quel formulaire de normalisation Unicode se trouvent-ils et pourquoi voudriez-vous le faire?
tchrist
1
Lorsque vous dites AZ et «alphanumérique», voulez-vous vraiment dire uniquement AZ ou voulez-vous faire correspondre toutes les lettres de toutes les langues, y compris les langues étrangères et les scripts obsolètes?
Mark Byers
Si vous faites cela pour pouvoir faire une comparaison de chaînes insensible aux accents, vous faites la mauvaise chose.
tchrist
3
Ce n'est pas seulement «de toutes les langues». C'est Anglais. L'anglais utilise l'écriture latine. Il y a unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l== 1192 points de code qui sont de l'alphabet latin mais qui ne sont pas AZ. Il est communément admis que l'ASCII est suffisant pour l'anglais. Ce n'est pas le cas, et c'est pourquoi écrire AZ a une odeur de code .
tchrist
1
@Scott B: l'anglais n'utilise pas seulement les 26 lettres de A à Z. Par exemple, le mot résumé inclut é. Peut-être pourriez-vous expliquer ce que vous essayez de faire, car cela pourrait vous aider à obtenir de meilleures réponses.
Mark Byers

Réponses:

212

Attention: notez que l'anglais n'est pas limité à AZ.

Essayez ceci pour supprimer tout sauf az, AZ et 0-9:

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

Si votre définition alphanumérique comprend des lettres dans des langues étrangères et des scripts obsolètes, vous devrez utiliser les classes de caractères Unicode.

Essayer ceci pour ne laisser que AZ:

$result = preg_replace("/[^A-Z]+/", "", $s);

La raison de l'avertissement est que des mots comme résumé contiennent la lettre équi ne correspondra pas à cela. Si vous souhaitez faire correspondre une liste spécifique de lettres, ajustez l'expression régulière pour inclure ces lettres. Si vous souhaitez faire correspondre toutes les lettres, utilisez les classes de caractères appropriées comme indiqué dans les commentaires.

Mark Byers
la source
2
Non, un alphanumérique est [\p{Alphabetic}\p{Numeric}]. J'ai oublié la propriété alphabétique PCRE, mais vous pouvez l'approcher avec [\pL\pM\pN].
tchrist
1
@tchrist: Je suppose que parce qu'il a spécifiquement mentionné AZ, il ne veut que correspondre à cela, bien que j'admette que la question pourrait être beaucoup plus claire sur ce point. Je vais demander une clarification.
Mark Byers
1
@Mark, je ne contestais pas la deuxième partie de votre réponse, bien que s'il n'a pas décomposé canoniquement la chaîne en premier, cela ne fonctionnera pas correctement. Je discutais avec la première partie. En outre, j'essaie de toujours corriger les expressions rationnelles qui fonctionnent sur toutes les données, pas seulement sur le vieux ASCII moisi. :) D'où le mantra que ce côté du Millénaire, [A-Z]est toujours faux, parfois .
tchrist
1
@Mark Byers, je vois .. et oui je préfère le imais je n'ai jamais eu à m'inquiéter que d'une démographie anglaise .. J'oublie que beaucoup de gens doivent penser à d'autres langues. BTW, je viens de remarquer que vous êtes l'utilisateur le plus représentant qui n'a jamais posé 1 question. Même Jon Skeet a déjà posé des questions!
JD Isaacks
1
pourquoi y a-t-il un + à la fin de l'expression rationnelle? Ne serait-ce pas ... pareil si vous le supprimiez?
Dennis
2

Au lieu de cela preg_replace, vous pouvez toujours utiliser les fonctions de filtrage de PHP en utilisant la filter_var()fonction avec FILTER_SANITIZE_STRING.

Mark Baker
la source
PHP a-t-il accès à l'algorithme ISO Stringprep? Je sais que Perl et Java le font.
tchrist
Je crois que la fonction de filtre de chaîne fonctionne principalement avec ASCII 7 bits, mais ne me citez pas là-dessus.
Mark Baker
30
S'il vous plaît, pouvez-vous nous dire une manière explicite de faire ce que l'utilisateur demande d'utiliser FILTER_SANITIZE_STRING? À ma connaissance, le plus proche qui peut être archivé de cette façon est avec FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH, mais cela ne laissera pas seulement des lettres et des chiffres, mais aussi des points, des barres obliques, des pourcentages et tout ça.
Pere
$ iMycleanVar = var_filtre ($ sStringWithNumbers, FILTER_SANITIZE_NUMBER_INT);
Sultanos
4
Cela ressemble plus à un commentaire qu'à une réponse. Donnez une explication appropriée en écrivant une réponse.
Siraj Alam
0
  1. Santize pour les nombres [ 0-9 ] et les alphabets en général [ \ pL ]:
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. Santize spécifiquement pour les alphabets A à Z (insensible à la casse) [ a-zA-Z ]:
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
Sky7ure
la source