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 :

Remplacer quelque chose entre 2 noms [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 63
    Points : 38
    Points
    38
    Par défaut Remplacer quelque chose entre 2 noms
    Bonjour tout le monde,
    J'ai un petit problème, j'aimerais remplacer quelque chose par quelque chose d'autre, voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //on repère d'abord si [liste],[/liste], [puce] et [/puce] 
    //sont présents dans la signature
    if(preg_match("/[liste]/", $signature) 
    AND preg_match("/[\/liste]/", $signature) 
    AND preg_match("/[puce]/", $signature) 
    AND preg_match("/[\/puce]/", $signature)) {
    $signature = str_replace('[ code]', '<div class="erreur">Code non autorisé', $signature);
    $signature = str_replace('[/ code]', '</div>',$signature);
    }
    else {
    $signature = str_replace('[ code]', '<div class="code">', $signature);
    $signature = str_replace('[/ code]', '</div>',$signature);
    }
    Ce bout de code marche bien mais il y a un petit problème,
    c'est que si la personne utilise [ code] [ /code] en ayant auparavant ou par après utilisé [ liste] [ /liste], il sera marqué "code non autorisé"
    pour la zone d'affichage du code.
    J'aimerais donc, grâce à une regex, savoir si on se trouve entre [ liste] [ /liste] et ne pas autoriser le code
    sinon, si on ne se trouve pas entre [ liste] [ /liste]
    on autorise l'affichage du code.
    Je remercie celle/celui qui m'aidera.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    En fait, ce qu'il faudrait faire ( et que je ne sais pas faire),

    c'est de récupérer le message entre [ liste] [ /liste] et remplacer [ code] [ /code] par

    <div class="erreur">Code non autorisé</div>

    Donc, il faut juste que je puisse récupérer le message situé entre [ liste] [ /liste]

    pour effectuer des opérations

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    !\[liste\](.*?)\[/liste\]!i

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    merci Antoun
    mais je fais comment pour exploiter ceci ?
    une petite précision m'aiderait

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    dans les regex, les parenthèses sont capturantes, càd qu'elles permettent de récupérer le texte qu'elles ont reconnu. Ce texte sera numéroté : $1 représente la capture de la première paire de parenthèses, $2 celle de la deuxième, etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $matches = array() ;
    preg_match($masque, $texte, $matches) ;
    echo $matches[1] ;
    $matches est le tableau de matches : son élément 0 contient le texte "matché" par l'ensemble du masque, l'élément 1 contient $1, etc.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    J'ai essayé ce que tu m'as indiqué Antoun mais je ne comprends toujours pas
    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(preg_match("/[liste]/", $signature) 
    AND preg_match("/[\/liste]/", $signature) 
    AND preg_match("/[puce]/", $signature) 
    AND preg_match("/[\/puce]/", $signature)) {
     
    $signature = str_replace(!\[liste\](.*?)\[/liste\]!i, '$1', '<div class="erreur">code non autorisé</div>',$signature)
    mais ça fonctionne pas
    mais j'ai plutôt l'impression que c'est moi qui me trompe

    Edit : [HORS SUJET] Je suis confronté à un problème tellement facile mais que je n'arrive pas à résoudre.
    Le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("DELETE FROM commentaires WHERE id_news='$id_news'");
    Cette requête, normalement censée supprimer les commentaires d'une news précise, ne supprime rien du tout ! Et la requête suivante s'éxécute convenablement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $delete = mysql_query("DELETE FROM news WHERE id='$id_news'");
    Est - ce normal ? [/HORS SUJET]

  7. #7
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Bonjour,

    Si tu utilise une expression régulière, alors il faut utiliser preg_replace et non str_replace

    Pour ton pb de delete, si id_news est un entier ( int, bigint,etc...) alors il ne faut pas mettre de cote.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Merci FCYPBA de ta réponse,
    mais comment puis - je utiliser preg_replace dans mon cas ?
    Je n'ai jamais utilisé les expressions régulières pour quoi que ce soit auparavant.
    Alors je me sens perdu

    Edit : le problème avec le DELETE venait d'une condition. Maintenant, il fonctionne mais le problème avec [ liste] et[/liste] persiste

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    En fait je répondais à ça :
    Citation Envoyé par beji15 Voir le message
    Donc, il faut juste que je puisse récupérer le message situé entre [ liste] [ /liste]
    Je recolle un peu les morceaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $masque = '!\[liste\](.*?)\[/liste\]!i' ;
    $matches = array() ;
    if (preg_match($masque, $signature, $matches) ) {
      $contenu_extrait = $matches[1] ;
    }
    Néanmoins, cela ne correspond pas à ce que tu veux puisque tu veux remplacer et pas "juste récupérer" (avec les lecteurs distraits comme moi, il faut éviter de changer d'avis d'une phrase sur l'autre, parce qu'on ne retient que la dernière).
    ... (à suivre)

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Merci Antoun, j'obtiens le message situé entre [liste] et[/liste]
    mais...une dernière question, en faisant ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $masque = '!\[liste\](.*?)\[/liste\]!i' ;
    $matches = array() ;
    if (preg_match($masque, $signature, $matches) ) {
      $contenu_extrait = $matches[1] ;
    }
    Si j'ajoute ceci au code, cela ne fonctionnerait pas ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $masque = '!\[liste\](.*?)\[/liste\]!i' ;
    $matches = array() ;
    if (preg_match($masque, $signature, $matches) ) 
    {
    $signature = str_replace('[ code]', '<div class="erreur">Code non autorisé', $signature);
    $signature = str_replace('[/ code]', '</div>',$signature);
    }
    ???????????????????

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Non, ça ne marcherait pas, ou plus exactement ça marcherait trop bien. Supposons que tu aies ça comme $signature :
    [CODE]echo "hello world !";[/CODE][LISTE]évitez le [CODE]format c:[/CODE][/LISTE]
    Si jai bien compris, tu veux interdire format c: et autoriser echo. Avec ton code, la regex matcherait le format ; du coup, toutes les balises [CODE][/CODE]seraient remplacées, y compris [I]echo[/I]..

    (au passage, pour pouvoir écrire [CODE] et [/CODE], il faut les mettre dans une balise [noparse].)

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Je reformule ton problème : tu veux remplacer les balises
    [CODE][/CODE] contenues dans des balises
    [LISTE][/LISTE] par des <DIV></DIV>.

    Cela peut donc s'écrire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $signature = preg_replace('!(\[LISTE\].*?)\[CODE\](.*?)\[\/CODE\](.*?\[\/LISTE\])!i', 
      "$1<div class="erreur">Code non autorisé : $2</div>$3",
      $signature) ;
    $1 : la balise [LISTE] et ce qui suit jusqu'à [CODE] exclu
    $2 : le contenu des balises [CODE][/CODE]
    $3 : ce qui est après [/CODE] jusqu'à[/LISTE]

  13. #13
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    ah ok , merci Antoun ! J'ai compris le principe.
    Encore merci++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 2.X] Expression régulière trouver quelque chose entre quotes
    Par Northis dans le forum Général Python
    Réponses: 1
    Dernier message: 05/11/2014, 13h59
  2. Quelque chose pour remplacer un "sleep()" ?
    Par devoluti0n dans le forum Langage
    Réponses: 12
    Dernier message: 19/11/2008, 16h01
  3. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  4. Réponses: 3
    Dernier message: 27/04/2004, 18h21

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