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
}
25
demandé sur ThinkingStiff 2011-10-13 15:23:06

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

80
répondu SERPRO 2014-05-06 08:59:21
if(!preg_match('/^[\w-]+$/', $string1)) {
   echo "String 1 not acceptable acceptable";
   // String2 acceptable
}
16
répondu matino 2017-09-01 12:14:58

\w\- est probablement le meilleur, mais ici, une autre alternative

Utilisez [:alnum:]

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

demo1/ demo2

1
répondu Thielicious 2017-08-31 17:06:11

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.

0
répondu mickmackusa 2017-09-01 12:36:59

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.

0
répondu Epiphany 2017-09-26 02:29:26

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

-1
répondu Anuj TBE 2017-06-03 07:05:11