Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/01/2013, 14h06   #1
Compufan
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Dordogne (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 6
Points : 0
Points : 0
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 :
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 :
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 :
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 :
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 :
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 :
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 !
Compufan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 17h16   #2
mokfajri
Membre à l'essai
 
Homme
Développeur Web
Inscription : 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
ç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.
mokfajri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 17h31   #3
Compufan
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Dordogne (Aquitaine)

Informations professionnelles :
Activité : Étudiant

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

Code :
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 :
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 :
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 :
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 :
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();
}
 
?>
Compufan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 19h59   #4
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 861
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 861
Points : 21 924
Points : 21 924
Code :
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
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 21h48   #5
Compufan
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Dordogne (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 6
Points : 0
Points : 0
Merci beaucoup sabotage ! Ca marche impeccable
Compufan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h53.


 
 
 
 
Partenaires

Hébergement Web