[PHP] Comment valider une regexp

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par 3fc3b4, 9 Juin 2010.

  1. 3fc3b4
    3fc3b4 WRInaute discret
    Inscrit:
    15 Avril 2007
    Messages:
    72
    J'aime reçus:
    0
    Bonjour,

    Je cherche une fonction qui me permette de savoir si une regexp est valide avant de l'appeller. :?

    J'ai un site qui demande à l'utilisateur de rentrer une expression régulière via un formulaire, mais si sa syntaxe n'est pas valide, celà provoque une erreur. Je souhaiterais tester la validité de l'expression avant de l'utiliser.

    J'ai cherché désespérément une fonction is_regexp mais elle n'existe pas, également, var_filter renvoie une erreur.

    J'ai trouvé une expression régulière pour tester les expressions régulières 8O :
    Code:
    /^((?:(?:[^?+*{}()[\]\]+|\.|\[(?:[^\]\]+|\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?\|?)*)$/
    mais sur mon serveur, celle ci renvoie l'erreur : recursive call could loop indefinitely. :(

    Merci de vos lumières pour cette énigme.
     
  2. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    Une combinaison de @ en préfixe de ton appel et de preg_last_error peut-être?

    Attention cependant à ce que tu autorises comme regex (ça dépend de comment tu l'utilises), tu risques d'ouvrir énormément de trous de sécurité, en particulier si tu utilises preg_replace et que tu laisses le flag "e" passer, mais il y a probablement d'autres failles possibles.

    Quel est l'intérêt de laisser cette flexibilité à l'utilisateur?

    Jacques.
     
  3. 3fc3b4
    3fc3b4 WRInaute discret
    Inscrit:
    15 Avril 2007
    Messages:
    72
    J'aime reçus:
    0
    Merci pour ta réponse en fait l'utilisation du @ n'évite pas l'erreur, simplement son affichage, seulement j'ai configuré mon serveur pour enregistrer toutes les erreurs, et la page concernant ce regexp est responsable d'une bonne partie de ces erreurs

    Il est donc préférable pour moi d'avoir une petite ligne de test. J'ai trouvé un code plutot compliqué mais qui ne me convient pas car il manipule un error_handler, mais ne supprime pas l'erreur.

    Code:
    function is_regexp( $reg_exp, $includes_delim = false )
    {
            $sPREVIOUSHANDLER = set_error_handler( '_trapError' );
            if( ! $includes_delim )
            {
                    $reg_exp = '#'.str_replace( '#', '\#', $reg_exp ).'#';
            }
            preg_match( $reg_exp, '' );
            restore_error_handler( $sPREVIOUSHANDLER );
    
            return !_traperror();
    }
    Sinon il n'y a pas de problème de sécurité, il s'agit d'un simple preg_match sur une liste de données avec des codes structurés ABCD1234 justifiant l'utilisation du regexp.
     
  4. 3fc3b4
    3fc3b4 WRInaute discret
    Inscrit:
    15 Avril 2007
    Messages:
    72
    J'aime reçus:
    0
    Toujours personne ?

    J'ai essayé de passer par var_filter() et la constante FILTER_VALIDATE_REGEXP mais je ne vois pas bien comment il fonctionne, il n'a pas l'air de faire ce que son nom indique...
     
  5. gg00xiv
    gg00xiv Nouveau WRInaute
    Inscrit:
    10 Juin 2010
    Messages:
    39
    J'aime reçus:
    0
    Pourquoi ne pas tester tout simplement ta regex et entourer ce test par un bloc try catch ?

    En cas de "catch", la regex est fausse, sinon, elle est bonne.
     
  6. 3fc3b4
    3fc3b4 WRInaute discret
    Inscrit:
    15 Avril 2007
    Messages:
    72
    J'aime reçus:
    0
    Imaginons que je veux tester avec preg_match($regexp, '');
    la fonction preg_match ne gènère pas d'exception, si ?
     
  7. gg00xiv
    gg00xiv Nouveau WRInaute
    Inscrit:
    10 Juin 2010
    Messages:
    39
    J'aime reçus:
    0
    Au temps pour moi, cf (http://php.net/manual/fr/function.preg-match.php), preg_match renvoie FALSE si une erreur survient. Donc tu as juste à tester :

    Code:
    if (preg_match($regexp, '') === FALSE) { /* $regexp fausse */ }
     
  8. 3fc3b4
    3fc3b4 WRInaute discret
    Inscrit:
    15 Avril 2007
    Messages:
    72
    J'aime reçus:
    0
    J'ai beau tester dans tous les sens, et même en utilisant ton code, PHP retourne une erreur :

    Erreur [2] preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 3

    La valeur de l'erreur est de type : 2 E_WARNING
     
Chargement...
Similar Threads - [PHP] valider regexp Forum Date
Astuce [PHP] Récolter ville, pays du visiteur Développement d'un site Web ou d'une appli mobile 9 Mars 2021
[PHP] Détecter le navigateur / bot en fonction du HTTP_USER_AGENT Développement d'un site Web ou d'une appli mobile 14 Septembre 2019
[PHP] Détecter le navigateur / bot en fonction du HTTP_USER_AGENT Développement d'un site Web ou d'une appli mobile 12 Janvier 2017
[PHP] Cookie vide dans une fonction, complet juste avant ou après Développement d'un site Web ou d'une appli mobile 25 Novembre 2014
[php] Cookie d'un domaine vers un sous-domaine Développement d'un site Web ou d'une appli mobile 29 Août 2014
[PHP]Cci mails Développement d'un site Web ou d'une appli mobile 18 Août 2014
[PHP] gethostbyname Développement d'un site Web ou d'une appli mobile 15 Février 2014
[PHP] file_get_contents retourne un "Connection timed out" Développement d'un site Web ou d'une appli mobile 14 Février 2014
[PHP] Regex Complexe Développement d'un site Web ou d'une appli mobile 29 Octobre 2013
[PHP] Formulaire dynamique Développement d'un site Web ou d'une appli mobile 2 Mai 2013
[php] error suite à code antiduplication Développement d'un site Web ou d'une appli mobile 5 Février 2013
[PHP] Condition et include Développement d'un site Web ou d'une appli mobile 31 Janvier 2013
[PHP] comprendre ce code pour pseudo-frame Développement d'un site Web ou d'une appli mobile 28 Décembre 2012
[PHP] Requête très lente Développement d'un site Web ou d'une appli mobile 22 Septembre 2012
[PHP] Question technique Regex Développement d'un site Web ou d'une appli mobile 28 Juillet 2012
[PHP] file_get_contents sur le serveur même... Développement d'un site Web ou d'une appli mobile 9 Juillet 2012
[PHP] FILTER_VALIDATE_IP et REMOTE_ADDR Développement d'un site Web ou d'une appli mobile 8 Juillet 2012
[PHP] Requête PDO à modifier Développement d'un site Web ou d'une appli mobile 13 Mai 2012
[PHP] Détecter l'OS, le navigateur et la langue [Résolu] Développement d'un site Web ou d'une appli mobile 4 Mars 2012
[Php] Vérifier la présence d'un slash en fin d'url Développement d'un site Web ou d'une appli mobile 2 Mars 2012