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 :

Modifier un texte situé entre deux <br>


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Points : 0
    Points
    0
    Par défaut Modifier un texte situé entre deux <br>
    Bonjour,

    Je voudrais, dans un texte, ajouter des balises h3 sur des ligne entourée de deux <br>, par exemple je voudrais remplacer ce texte :

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do<br>
    eiusmod tempor incididunt ut labore et dolore magna aliqua. <br>
    <br>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do<br>
    eiusmod tempor incididunt ut labore et dolore magna aliqua. <br>
    <br>
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. <br>
    <br>
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.<br>
    Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    par

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do<br>
    eiusmod tempor incididunt ut labore et dolore magna aliqua. <br>
    <br>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do<br>
    eiusmod tempor incididunt ut labore et dolore magna aliqua. <br>
    <br>
    <h3>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</h3> <br>
    <br>
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.<br>
    Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    La difficulté que je rencontre c'est que je voudrais que ça s'applique seulement au contenu entouré par 2 <br> qui ne contient pas de <br>...

    Et la, j'avoue, je galère...

    Si qqun peut m'aider

  2. #2
    Invité
    Invité(e)
    Par défaut
    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
    <?php
     
    $data = "
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do<br>
    eiusmod tempor incididunt ut labore et dolore magna aliqua. <br>
    <br>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do<br>
    eiusmod tempor incididunt ut labore et dolore magna aliqua. <br>
    <br>
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. <br>
    <br>
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.<br>
    Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    ";
     
    $new = preg_replace('@((?:<br>\R?){2})((?:(?!<br>).)+)((?:\R?<br>){2})@i', '$1<h3>$2</h3>$3', $data);
     
    var_dump($new);
    echo $new;
     
    ?>

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    S'il s'agit de texte contenant uniquement des balises <br> (et aucune autre balise), tu peux utiliser cette pattern pour limiter au maximum le backtracking tout en trimant le texte à gauche et à droite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = preg_replace('~<br/?>\s*<br/?>\s*\K[^<]*[^\s<](?=\s*<br/?>\s*(*SKIP)<br/?>)~i', '<h3>$0</h3>', $texte);
    • \K enlève de la correspondance globale tout ce qui est à sa gauche (ici, les deux <br> et les caractères blancs.)
    • [^<]*[^\s<] est une astuce pour éviter d'utiliser un quantificateur paresseux, en imposant que le dernier caractère ne soit pas un caractère blanc.
    • (?=...) est un test avant (lookahead), il ne consomme aucun caractère, c'est juste pour vérifier ce qui suit, il ne fait donc pas partie de la correspondance globale. Ça évite de créer un groupe de capture, et comme les caractères ne sont pas consommés, cela permet d'obtenir des résultats consécutifs "<br><br>texte1<br><br>texte2<br><br>"
    • le (*SKIP) empêche tout backtracking si le deuxième <br> n'est pas trouvé.


    Par contre, s'il y a d'autres balises, tu devras traiter ton texte comme du html et utiliser DOMDocument, à coup de DOMNode->nextSibling pour trouver les parties qui t'intéressent. Ça risque d'être fastidieux, mais le résultat est garanti.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Points : 0
    Points
    0
    Par défaut
    Merci beaucoup, ça fonctionne à merveille !

    Par contre j'ai une autre question, je voudrais supprimer les "<br>" mais pas les "<br><br>", je vois pas comment faire et crois pas que ce soit possible avec str_replace... Pouvez-vous m’éclairez ?

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Si tu veux préserver les doubles <br> juste pour une histoire d'affichage, c'est un peu bête. Dans ce cas là, autant tous les enlever et utiliser les css pour augmenter le margin-top et le margin-bottom de tes balises <h3>.

    Maintenant si c'est pour une autre raison:

    Si tes doubles <br> sont toujours séparés d'une nouvelle ligne (\n sous unix, \r\n sous Windows) et aucun autre caractère, tu peux très bien utiliser str_replace avec un technique de placeholder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $eol = "\n"; // ou "\r\n" pour Windows
    $trans = array('<br>' . $eol . '<br>' => '#-#-#',
                   '<br>' => '',
                   '#-#-#' => '<br>' . $eol . '<br>');
    $texte = str_replace(array_keys($trans), $trans, $texte);
    Si par contre ils sont séparés d'un nombre indéfini de caractères blancs, là tu dois en passer par une regex. Par exemple en utilisant \K pour zapper les cas où deux <br> se suivent.

    Tu peux faire tes tests ici: https://regex101.com
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Points : 0
    Points
    0
    Par défaut
    Merci !

    J'ai une derniere question, il est vrai que je rame avec les expressions régulières...

    En fait je veux passer en h3 ce qui est entouré de deux <br> et qui ne contient qu'un seul "." , car je me retrouve avec des paragraphes entiers en h3 parfois... Que dois-je rajouter cette l'expression:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('@((?:<br>\R?){2})((?:(?!<br>).)+)((?:\R?<br>){2})@i', '$1<h3>$2</h3>$3', $data);
    merci encore !

Discussions similaires

  1. [RegEx] Extraction de texte situé entre deux balises
    Par cedricp38 dans le forum Langage
    Réponses: 4
    Dernier message: 10/09/2012, 13h54
  2. [RegEx] Capturer les chaînes situées entre deux symboles
    Par babib92 dans le forum Langage
    Réponses: 2
    Dernier message: 16/11/2007, 14h20
  3. [RegEx] Extraction de texte situé entre deux balises
    Par morpho365 dans le forum Langage
    Réponses: 7
    Dernier message: 27/03/2007, 18h18
  4. [RegEx] Extraire du texte situé entre deux séparateurs différents
    Par Marco33 dans le forum Langage
    Réponses: 7
    Dernier message: 06/02/2007, 18h20
  5. Réponses: 5
    Dernier message: 10/04/2006, 12h07

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