web-dev-qa-db-fra.com

PHP preg_match - n'autorise que les chaînes alphanumériques et - _ caractères

J'ai besoin de l'expression régulière pour vérifier si une chaîne de caractères ne contient que des chiffres, des lettres, des traits d'union ou des traits de soulignement

$string1 = "This is a string*";
$string2 = "this_is-a-string";

if(preg_match('******', $string1){
   echo "String 1 not acceptable acceptable";
   // String2 acceptable
}
25
Lee Price

Code:

if(preg_match('/[^a-z_\-0-9]/i', $string))
{
  echo "not valid string";
}

Explication:

  • [] => définition de la classe de caractères
  • ^ => nie la classe
  • a-z => caractères de 'a' à 'z'
  • _ => trait de soulignement
  • - => trait d'union '-' (vous devez y échapper)
  • 0-9 => nombres (de zéro à neuf)

Le modificateur "i" à la fin de la regex est pour "insensible à la casse" si vous ne mettez pas cela, vous devrez ajouter les majuscules au code avant de faire A à Z

81
SERPRO
if(!preg_match('/^[\w-]+$/', $string1)) {
   echo "String 1 not acceptable acceptable";
   // String2 acceptable
}
17
matino

\w\- est probablement le meilleur mais voici juste une autre alternative
Utilisez [:alnum:]

if(!preg_match("/[^[:alnum:]\-_]/",$str)) echo "valid";

demo1 | demo2

2
Thielicious

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 caractère de lettre de n'importe quelle langue
  • p {N} => correspond à tout type de caractère numérique
  • _- => correspond au trait de soulignement et au trait d'union
  • + => Quantifier - Correspondances entre un à illimité (gourmand) 
  • / u => modificateur Unicode. Les chaînes de modèle sont traitées comme UTF-16. De plus, Fait correspondre les séquences d'échappement aux caractères Unicode

Notez que si le trait d'union est le dernier caractère de la définition de classe, il _ {il n'est pas nécessaire qu'il soit échappé} _. Si le tiret apparaît ailleurs dans la définition de la classe, il doit être échappé, car il sera considéré comme un caractère de plage plutôt qu'un trait d'union.

2
Epiphany

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 Lien de démonstration où je montre comment différentes entrées produisent différents tableaux de sortie.

0
mickmackusa