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 :

Interdire les slashs et un mot particulier


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Points : 57
    Points
    57
    Par défaut Interdire les slashs et un mot particulier
    Bonjour,

    je tente de construire une regex qui m'interdirait les "/" ainsi que le mot "page".

    Sur les tous les tutos que j'ai pu trouver, il y en a aucun qui donne un exemple mixant les deux.

    J'ai essayé la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (preg_match('#[^page/]#', $test){
         echo 'ca passe';
    }
    si $test = 'page/' , ok ça ne passe pas
    mais si $test = 'page/2' ou bien $test = 'categorie/section' , ça passe :/

    Merci de m'indiquer une piste

  2. #2
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    Bonjour,
    Pourquoi utiliser un regex, et non une recherche de chaine de charactere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (strpos($test, 'page/') === false){
         echo 'ca passe pas';
    }
    else echo 'ca passe';
    Z.

  3. #3
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Points : 12 572
    Points
    12 572
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (preg_match('#(/|page)#i'))
    {
      echo 'Pas bon';
    }
    J'ai pas testé mais ça devrait être bon
    Pas de questions techniques en MP please

    Mon site perso

    Mon profil Viadeo

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par RideKick Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (preg_match('#(/|page)#i'))
    {
      echo 'Pas bon';
    }
    J'ai pas testé mais ça devrait être bon

    Merci
    Eh bien cet exemple marche
    Le truc c'est que j'ai besoin de le faire dans l'autre sens (pour une route Zend_Route), donc d'indiquer plutot ce qui est interdit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    route.reqs.categorie = "(\w)*"
    Et là sur le coup, je vois pas comment utiliser le "^" , dans un crochet, en indiquant qu'il interdise un slash ou le mot page, et non pas des caractères p-a-g-e ou /

    J'espere m'être fait comprendre

    edit :
    J'ai essayé
    Mais avec "page/2" , ça passe quand même :/

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Points : 57
    Points
    57
    Par défaut
    Après une recherche "regex interdire un ou plusieurs mots" sur google, aucune solution n'est proposée, les posts restent à l'abandon


  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2010
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    Je ne suis pas à 100% sûr de comprendre ce que tu veux faire...

    Comme mentionné plus haut si tu utilise un preg_match avec un if "inversé"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( !preg_match( "#(page|/)#" ) )

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour,



    J’ai trouvé la réponse à ta question, mais c’est une manière tordue de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (preg_match('#\A(.(?!page|/))*\Z#S'))
    {
      echo ’OK: pas de slash, ni de mot page’;
    }
    Si j’ai bien compris là façon de spécifier les options en PHP, le S dans ce code est destiné à rendre le point matchant avec n’importe quel caractère, de façon que .* puisse aller jusqu’au bout de la chaîne jusqu’à matching du \Z. cette option est essentielle pour que cette RE marche.



    Pour moi, ce n’est pas une bonne manière de faire car les assertions ne sont pas destinées à vérifier pour toutes les positions d’une chaîne si ce qui précède ou ce qui suit est ou n’est pas un certain sous-motif. Elles sont destinées à vérifier qu’en une position qui fait partie d’une portion de chaîne que le moteur de regex est en train de vérifier comme étant matchant, il n’y a devant ou derrière cette position pas d’un certain motif, ou au contraire qu’il y est bien.
    Une assertion avant ou arrière n’est censée être activée, à mon idée, qu’à certaines positions et non pas partout.






    Par ailleurs, [^/|page] est complétement à coté de la plaque pour trois raisons:

    - un ensemble défini entre crochet symbolise l’ensemble des caractères qui peuvent se trouver à UNE position, il ne symbolise pas ce qu’on peut trouver sur une succession de positions de la chaîne explorée.
    Donc mettre le mot ’page’ entre crochets avec l’espoir d’indiquer ainsi qu’il ne doit pas apparaître est une incompréhension de ce symbolisme.

    - les caractères spéciaux perdent leur spécialité quand ils sont entre crochets.
    Ainsi [^/|page] symbolise un caractère qui doit n’être ni le slash ’/’, ni la barre verticale ’|’, ni le ’p’ , ni le ’a’, ni le ’g’, ni le ’e’.
    Du moins est-ce ce que j’ai vérifié avec un code Python, mais il n’y a pas de raison que PHP fasse autrement.

    - enfin si tu voulais éviter à la fois ’/’ et le mot ’page’ dans un texte, ce serait plutôt un ET qu’un OU qu’il faudrait utiliser dans une expression censée vérifier leur absence


    De ce fait, "page/2" matche avec la RE ([^/|page])

    car faire preg_match(’#([^/|page])#’) signifie: je recherche un caractère qui ne soit ni '/’, ni '|’, ni 'p’, ni 'a’, ni 'g’, ni ’e’.

    Et la fonction trouve ’2’ qui s’accorde à ces conditions.


    ------------------

    La bonne manière de faire est celle qui t’a été indiquée sans que tu y prêtes attention:
    chercher la chaîne ’page’ et le caractère ’/’ dans le texte avec la fonction strpos.
    Pourquoi aller chercher midi à quatorze heure avec des regex mal comprises ?

  8. #8
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    Je persiste à penser que le strpos est une solution plus logique, et donc plus simple a ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( (strpos($test, '/') === false) || (strpos($test, 'page') === false) ){
         echo 'ca passe pas';
    }
    Z.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Points : 57
    Points
    57
    Par défaut
    Merci pour vos propositions.

    En fait pour comprendre ma problématique, je n'utilise pas le pattern dans le cadre d'une fonction PHP, donc je ne peux pas utiliser de if inversé.
    J'ai besoin du pattern pour la définition d'une route Zend_Route.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    actus_par_cat.route = "actualites/:categorie/*"
    actus_par_cat.reqs.categorie = "[-\w]*"
    Dans les reqs de categorie, comme vous pouvez le voir, pour le moment, j'autorise entre [] tous les caractères alphanumériques ainsi que les "-".
    Mais je dois interdire le "/" et le mot "page".
    Chose que je n'arrive pas à faire, je ne trouve aucun exemple sur ce genre de cas de figure

    edit : ok , je m'excuse par avance de pas avoir fait la précision, je pensais trouver une réponse directe à la demande de base et pas une autre manière de le faire. Merci encore pour votre aide
    edit 2 : oops mais si qu'est ce que je raconte, j'en parle déjà dans mon 2eme post

Discussions similaires

  1. Compter les syllabes d'un mot français
    Par david_chardonnet dans le forum Langage
    Réponses: 4
    Dernier message: 09/05/2014, 10h57
  2. [Struts]Interdire les cookies
    Par yush dans le forum Struts 1
    Réponses: 4
    Dernier message: 07/02/2006, 13h11
  3. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59
  4. Réponses: 2
    Dernier message: 22/07/2005, 08h52
  5. Utiliser les exceptions pour un traitement particulier ?
    Par Blustuff dans le forum Assembleur
    Réponses: 11
    Dernier message: 01/12/2004, 02h21

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