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 :

Capture et remplacement ne se font pas sur plusieurs lignes [RegEx]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Points : 4
    Points
    4
    Par défaut Capture et remplacement ne se font pas sur plusieurs lignes
    Bonjour,

    Je poste ce thread car pour mon site web perso j'ai décidé de mettre en place une forme de BBCode afin de mettre en forme les articles que tout membre inscrit à mon site web peut poster.
    Voilà les fichiers qui me servent à rédiger un article (en tant que membre connecté), le stocker dans la base de données et l'afficher dans la section que le membre connecté a sélectionné :

    - ecrire_article.php
    - article_traitement.php
    - php/connexion_bdd.php
    - php/fonctions_caracteres_speciaux.php
    - php/affichage_articles.php


    php/connexion_bdd.php

    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
    <?php
     
    function connexionBdd()
    {
        try
        {
          $bdd = new PDO('mysql:host=localhost;dbname=ma_base', 'root', '');
          return $bdd;
        }
     
        catch(Exception $e)
        {
          die('Erreur : '.$e->getMessage());
        }
    }
    ?>
    php/fonctions_caracteres_speciaux.php

    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
    17
    18
    19
    20
    <?php
     
    function securiserContenu($contenuArticle)
    {
      $contenuSecurise = stripslashes($contenuArticle);
      $contenuSecurise = htmlspecialchars($contenuArticle);
      $contenuSecurise = nl2br($contenuArticle);
      return $contenuSecurise;
    }
     
    function miseEnForme($contenuArticle)
    {
      $misEnForme = preg_replace('#\[soulign\](.+)\[/soulign\]#isU', '<span style="text-decoration:underline">$1</span>', $contenuArticle);
      $misEnForme = preg_replace('#\[gras\](.+)\[/gras\]#isU', '<span style="font-weight:bold">$1</span>', $contenuArticle);
      $misEnForme = preg_replace('#\[it\](.+)\[/it\]#isU', '<span style="font-style:italic">$1</span>', $contenuArticle);
     
      return $misEnForme;
    }
     
    ?>
    php/affichage_articles.php

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    require_once('connexion_bdd.php');
    require_once('fonctions_caracteres_speciaux.php');
     
    function afficherArticles($section)
    {
      $bdd = connexionBdd();
      $req = $bdd->prepare("SELECT id, nomMembre, prenomMembre, titre, dateParution, contenu, dateParution, section FROM articles WHERE section=? ORDER BY id DESC");
      $req->execute(array($section));
     
      while($datas = $req->fetch())
      {
          $datas['contenu'] = miseEnForme($datas['contenu']);
      ?>
     
      <article class="article">
        <p class="titre_article"><strong><?php echo $datas['titre']; ?></strong></p>
      <?php echo '<span class="contenu_article">'.$datas['contenu'].'</span>'; ?>
      <p class="infos_article">Publié le <?php echo $datas['dateParution']; ?>, par <?php echo $datas['prenomMembre'].' '.$datas['nomMembre']; ?></p>
      </article>
      <hr />
     
     
      <?php
      }
      $req->closeCursor();
    }
     
    ?>
    ecrire_article.php

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <?php
    require_once('debut_page.php');
    ?>
     
    <section>
     
      <!-- Texte du formulaire -->
     
      <form method="post" action="article_traitement.php" class="articles">
        <p>
          <label for="titre_article">Titre de l'article <em>(obligatoire)</em></label>
          <input type="text" name="titre_article" id="titre_article" size="65"><br />
          <label for="contenu_article">Contenu de l'article <em>(obligatoire)</em></label> <br />
          <textarea name="contenu_article" id="contenu_article" rows="15" cols="115"></textarea> <br />
          <label for="publier_dans">Publier dans <em>(obligatoire)</em>... </label> <br />
          <select name="publier_dans" id="publier_dans">
     
            <option value="accueil">Accueil</option>
            <optgroup label="Actualités">
            <option value="evenements">Evénements</option>
            </optgroup>
            <optgroup label="Historique">
              <option value="actions_menees">Actions menées</option>
              <option value="dates_reperes">Quelques dates repères</option>
            </optgroup>
            <optgroup label="Articles thématiques">
              <option value="culture">Culture</option>
              <option value="economie">Economie</option>
              <option value="education">Education</option>
              ...
            </optgroup>
          </select>
          <input type="submit" value="Publier !" />
        </p>
      </form>
    </section>
     
    <?php
    require_once('fin_page.php');
    ?>
    article_traitement.php

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php
    require_once('debut_page.php');
    require_once('php/connexion_bdd.php');
    require_once('php/fonctions_caracteres_speciaux.php');
    ?>
     
    <section>
    <?php
    $titreArticle = $_POST['titre_article'];
    $contenuArticle = $_POST['contenu_article'];
    $publierDans = $_POST['publier_dans'];
     
    if(!isset($titreArticle) || !isset($contenuArticle) || !isset($publierDans))
    {
    ?>
    <p>Texte d'erreur</p>
    <?php
    }
    else
    {
      $bdd = connexionBdd();
      $contenuArticle = securiserContenu($contenuArticle);
     
      // ...
      $dateActuelle = date('d/m/Y, H:i');
     
      $req = $bdd->prepare('INSERT INTO articles (idMembre, nomMembre, prenomMembre, titre, contenu, dateParution, section) VALUES (:a, :b, :c, :d, :e, :f, :g)') or die(print_r($req->errorInfo()));
     
      $req->execute(array('a' => $_SESSION['id'],
                          'b' => $_SESSION['nom'],
                          'c' => $_SESSION['prenom'],
                          'd' => $titreArticle,
                          'e' => $contenuArticle,
                          'f' => $dateActuelle,
                          'g' => $publierDans));
     
      $req->closeCursor();
    }
    ?>
    </section>
     
    <?php
    require_once('fin_page.php');
    ?>
    Voici une des pages censées afficher mes articles, par thème (index.php)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php include ("debut_page.php"); 
    require_once('php/fonctions_caracteres_speciaux.php');
    require_once('php/affichage_articles.php');
    ?>
     
    <section>
    <!-- Contenu -->
    <?php
    afficherArticles('accueil');
    ?>
     
    </section>
     
    <?php include ("fin_page.php"); ?>
    Voilà. Concrètement, le problème que j'ai est que le BBCode n'est transformé que sur la dernière ligne en HTML. (les balises comme [gras], [soulign]... restent telles qu'elles)

    Auriez-vous des pistes pour m'aider à résoudre ce problème ? En tout cas pour moi ça n'a pas été évident jusqu'ici, je pense que le nombre de fichiers que j'ai utilisés et l'utilisation d'une BDD compliquent les choses. En tout cas, merci d'avance !

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Points : 24
    Points
    24
    Par défaut
    ça ne sert à rien de donner le code de tous les fichiers. Le mieux est d'isolé le problème et donner juste un exemple pour l'expliquer. Cela va nous permettre au moins de tester la solution avant de la poster.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Voilà concrètement le problème. Quand je mets en forme mon article grâce à mon BBCode personnalisé comme ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [gras]a[/gras]
    [soulign]b[/soulign]
    [it]c[/it]
    J'obtiens ceci dans ma table articles de ma base de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [gras]a[/gras]<br />
    [soulign]b[/soulign]<br />
    [it]c[/it]
    Quand je poste mon article dans la page d'accueil, j'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [gras]a[/gras]
    [soulign]b[/soulign]
    [it]c[/it]
    Autrement dit, à l'affichage de mon texte grâce à la fonction afficherArticles, le texte n'est pas parsé. Voici pour information la fonction me permettant de parser mon texte et celle me permettant de l'afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    function miseEnForme($contenuArticle)
    {
      $misEnForme = preg_replace('#\[soulign\](.+)\[/soulign\]#isU', '<span style="text-decoration:underline">$1</span>', $contenuArticle);
      $misEnForme = preg_replace('#\[gras\](.+)\[/gras\]#isU', '<span style="font-weight:bold">$1</span>', $contenuArticle);
      $misEnForme = preg_replace('#\[it\](.+)\[/it\]#isU', '<span style="font-style:italic">$1</span>', $contenuArticle);
     
      return $misEnForme;
    }
     
    ?>
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    require_once('connexion_bdd.php');
    require_once('fonctions_caracteres_speciaux.php');
     
    function afficherArticles($section)
    {
      $bdd = connexionBdd();
      $req = $bdd->prepare("SELECT id, nomMembre, prenomMembre, titre, dateParution, contenu, dateParution, section FROM articles WHERE section=? ORDER BY id DESC");
      $req->execute(array($section));
     
      while($datas = $req->fetch())
      {
          $datas['contenu'] = miseEnForme($datas['contenu']);
      ?>
     
      <article class="article">
        <p class="titre_article"><strong><?php echo $datas['titre']; ?></strong></p>
      <?php echo '<span class="contenu_article">'.$datas['contenu'].'</span>'; ?>
      <p class="infos_article">Publié le <?php echo $datas['dateParution']; ?>, par <?php echo $datas['prenomMembre'].' '.$datas['nomMembre']; ?></p>
      </article>
      <hr />
     
     
      <?php
      }
      $req->closeCursor();
    }
     
    ?>

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function miseEnForme($contenuArticle)
    {
      $misEnForme = preg_replace('#\[soulign\](.+)\[/soulign\]#isU', '<span style="text-decoration:underline">$1</span>', $contenuArticle);
      $misEnForme = preg_replace('#\[gras\](.+)\[/gras\]#isU', '<span style="font-weight:bold">$1</span>', $misEnForme );
      $misEnForme = preg_replace('#\[it\](.+)\[/it\]#isU', '<span style="font-style:italic">$1</span>', $misEnForme );
     
      return $misEnForme;
    }
    sinon tu n'executes que la dernière ligne
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup sabotage ! Ca marche impeccable

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/03/2009, 13h33
  2. java.sql.SQLException: Pas sur la ligne d'insertion
    Par Jcpan dans le forum Débuter
    Réponses: 2
    Dernier message: 15/01/2009, 08h52
  3. Réponses: 4
    Dernier message: 20/05/2008, 13h46
  4. Mon code ne tient pas sur une ligne
    Par supertoms dans le forum VBA Access
    Réponses: 1
    Dernier message: 21/04/2008, 17h35
  5. Réponses: 2
    Dernier message: 29/05/2006, 12h43

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