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:
$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.
Partager