IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

alternative de preg_match


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut alternative de preg_match
    Bonjour,

    J'utilise la fonction preg_match pour valider une expression régulière. En fait le pattern est : [A-Z][0-9] et la chaine saisie normalement doit être par exemple (A2 ou B9 etc....). Mais le fonction preg_match me donne un résultat qui ne correspond pas à mes attentes.
    Vous savez que preg_match retourne 1 si elle trouve le pattern sur la chaine. Par exemple si je saisi (jjjjjA2llll) elle va me retourner 1.(Mais moi je veux qu'elle me retourne 0, parce que cette chaine ne correspond pas au pattern).
    Donc, je voudrai une fonction en php qui teste toute la chaine saisie, et elle doit me retourner 1 ou 0.

    Merci.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Ben il faut ajouter les ancres de début (^) et fin de chaîne ($) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (preg_match('~^[A-Z]\d$~D', $chaine)) {
        echo 'Valide';
    } else {
        echo 'Non valide';
    }

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut
    Oui, je sais si on modifie le pattern, je vais résoudre ce problème. mais j'ai cité cet exemple seulement pour expliquer le problème.
    Je veux une méthode qui cherche le pattern sur une chaine, et si elle trouve une erreur, donc elle doit me retourner false.
    Merci pour votre réponse.
    (C urgent)

  4. #4
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Citation Envoyé par nabich Voir le message
    Par exemple si je saisi (jjjjjA2llll) elle va me retourner 1.(Mais moi je veux qu'elle me retourne 0, parce que cette chaine ne correspond pas au pattern)
    Pourquoi ne correspond-elle pas au pattern ?


    Citation Envoyé par nabich
    Je veux une méthode qui cherche le pattern sur une chaine, et si elle trouve une erreur
    C'est quoi une "erreur" selon toi ?

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2009
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 156
    Par défaut
    pas sur mais je fait un pregmatch dans ma class file... ne serait ce pas un truc comme ca que tu souhaite???:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    	private function setName($Name){
    		$chars = array('/\./', '/\*/', '/\?/', '/&/','/"/', '/#/', '/~/', '/{/', '/\(/', '/\[/', '/\|/', '/`/', '/_/', '/\^/', '/\)/', '/\]/', '/=/', '/\+/', '/}/', '/%/', '/;/', '/\//', '/!/', '/§/', '/</', '/>/');
                    $max = count($chars);
    		$check = true;
    		for ($i=0;$i<$max;$i++) {
      			if (preg_match($chars[$i],$Name)) {
      				$check = false;
       			}
       		}
       		if($check){
       			$this->_fileName = $Name;
       			return $this;
       		}
       		self::setError("Invalid file name characters");
       		return false;
    	}

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 38
    Par défaut
    @Ze AzAr : Merci, mais c'est pas le truc que je cherche.
    @Mr N. : Est ce que cette chaine (jjjjjA2llll) correspond à ce pattern ([A-9][0-9]) ?
    En fait, je cherche une méthode qui traite toute ma chaine, et si elle trouve un seul caractère qui ne correspond pas au pattern (même il y a des occurrences qui correspondent au pattern) elle doit me retourner 0 ou false.
    Merci.

  7. #7
    Membre éprouvé
    Inscrit en
    Juillet 2009
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 156
    Par défaut
    ben au final si... ce que tu cherche c'est exactement ca mais à l'inverse de moi

    moi je test les caractères interdit... tu dois faire l'inverse pour tester les caractères autorisé...

  8. #8
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Citation Envoyé par nabich Voir le message
    @Mr N. : Est ce que cette chaine (jjjjjA2llll) correspond à ce pattern ([A-9][0-9]) ?
    Oui bien sur.

    Citation Envoyé par nabich Voir le message
    En fait, je cherche une méthode qui traite toute ma chaine, et si elle trouve un seul caractère qui ne correspond pas au pattern (même il y a des occurrences qui correspondent au pattern) elle doit me retourner 0 ou false.
    Dans ce cas là c'est ton pattern qui doit être modifié pour ne demander que ce que tu attends. Ce que tu attends c'est une lettre suivie d'un chiffre et ça sans rien avant et sans rien après. Donc ton pattern doit être le suivant
    Cf la réponse de julp.

  9. #9
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Sans vouloir polluer le post de nabich...
    Citation Envoyé par Ze AzAr Voir le message
    pas sur mais je fait un pregmatch dans ma class file... ne serait ce pas un truc comme ca que tu souhaite???:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    	private function setName($Name){
    		$chars = array('/\./', '/\*/', '/\?/', '/&/','/"/', '/#/', '/~/', '/{/', '/\(/', '/\[/', '/\|/', '/`/', '/_/', '/\^/', '/\)/', '/\]/', '/=/', '/\+/', '/}/', '/%/', '/;/', '/\//', '/!/', '/§/', '/</', '/>/');
                    $max = count($chars);
    		$check = true;
    		for ($i=0;$i<$max;$i++) {
      			if (preg_match($chars[$i],$Name)) {
      				$check = false;
       			}
       		}
       		if($check){
       			$this->_fileName = $Name;
       			return $this;
       		}
       		self::setError("Invalid file name characters");
       		return false;
    	}
    Si ça marche, tant mieux pour toi, ne touche à rien, mais je pense que c'est loin d'être performant. En effet tu sous-estime le power des regexp.
    1. utiliser preg_match est puissant mais couteux. Ici tu fais juste un test sur la présence d'un caractère... un strpos aurait été moins gourmant et plus approprié.
    2. ta boucle sur ta collection de caractères à interdire peut être optimisée en utilisant les classes de caractère [\.\*\?"#.......]. Ainsi en un appel preg_match (à la place de ton for) c'est fini. Et je pense que cet unique appel peut etre remplacé par une fonction de chaine comme suggéré en 1.

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2009
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 156
    Par défaut
    adapté rapidement, j'utilisais "ereg" avant..

    Il faut que je modifie pour utiliser un vrai regex avec preg_match

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. Alternative au dbms_output ?
    Par dam1311 dans le forum Oracle
    Réponses: 10
    Dernier message: 24/11/2004, 08h11
  3. [xsl] alterner de style entre deux apply-template
    Par laouache dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 23/04/2004, 11h49
  4. Alternative(s) a CVS
    Par MrSimon dans le forum SCM
    Réponses: 3
    Dernier message: 06/03/2004, 11h37
  5. [FORMATION] Formations par alternance
    Par chobol dans le forum Etudes
    Réponses: 10
    Dernier message: 20/02/2004, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo