PHP preg match - autoriser uniquement les chaînes alphanumériques et des caractères de
j'ai besoin du regex pour vérifier si une chaîne ne contient que des nombres, des lettres, des traits d'Union ou des soulignements
$string1 = "This is a string*";
$string2 = "this_is-a-string";
if(preg_match('******', $string1){
echo "String 1 not acceptable acceptable";
// String2 acceptable
}
6 réponses
Code:
if(preg_match('/[^a-z_\-0-9]/i', $string))
{
echo "not valid string";
}
Explication:
- [] = > définition de la classe de caractères
- ^ => nier la classe
- a-z => caractères de 'a' à 'z'
- _ => trait de soulignement
- - => tiret '-' (Vous avez besoin de s'en échapper)
- 0-9 => nombres (de zéro à neuf)
le modificateur 'i' à la fin du regex est pour 'case-insensitive' si vous ne mettez pas que vous aurez besoin d'ajouter les caractères majuscules dans le code avant en faisant A-Z
if(!preg_match('/^[\w-]+$/', $string1)) {
echo "String 1 not acceptable acceptable";
// String2 acceptable
}
\w\-
est probablement le meilleur, mais ici, une autre alternative
Utilisez [:alnum:]
if(!preg_match("/[^[:alnum:]\-_]/",$str)) echo "valid";
Voici une méthode funky non-regex utilisant str_word_count ():
if($string===str_word_count($string,1,'-_0...9')[0]){
// ^^^^^^^--- characters to allow, see documentation
echo "pass";
}else{
echo "fail";
}
voir le Le Lien De Démonstration où je montre comment différentes entrées résultent en différents tableaux de sortie.
voici un équivalent de la réponse acceptée pour le monde UTF-8.
if (!preg_match('/^[\p{L}\p{N}_-]+$/u', $string)){
//Disallowed Character In $string
}
Explication:
- [] = > définition de la classe de caractères
- P{L} => correspond à n'importe quel type de caractère de lettre de n'importe quelle langue
- p{N} => correspond à n'importe quel type de caractère numérique
- _ _ - = > corresponds underscore and tiret
- + => Quantificateur - Matches entre un nombre illimité de fois (gourmand)
- /u => modificateur Unicode. Modèle les chaînes sont traitées comme UTF-16. Également provoque des séquences d'échappement pour correspondre aux caractères unicode
Notez que si le trait d'union est le dernier caractère de la définition de la classe n'a pas besoin d'être échappés. Si le tiret apparaît ailleurs dans la définition de la classe, il doit être échappés, car il sera considéré comme un caractère de portée plutôt que comme un trait d'Union.
Pourquoi utiliser regex? PHP a quelques fonctionnalités intégrées pour le faire
<?php
$valid_symbols = array('-', '_');
$string1 = "This is a string*";
$string2 = "this_is-a-string";
if(preg_match('/\s/',$string1) || !ctype_alnum(str_replace($valid_symbols, '', $string1))) {
echo "String 1 not acceptable acceptable";
}
?>
preg_match('/\s/',$username)
vérifie espace vide
!ctype_alnum(str_replace($valid_symbols, '', $string1))
vérifie valid_symbols