27-07-2011, 11:02 PM
Ca a l'air de pouvoir se faire avec des regex "imbriquées" (en tout cas ça marche sur ton 1er exemple)
En fait, je m'intéresse à ce qu'il y a avant les balises (ici je me suis limité à h1 et a), ou à ce qu'il y a après toutes les balises. Et j'applique vraiment la substitution à ces sous-ensembles.
Si on le déroule sur ton exemple :
Entrée: 'Du texte avec un titre : <h1>super titre</h1> et un second titre, mais vaux mieux cliquer <a href="lien du titre ici"> sur ce titre ci </a> pour un meilleur titre';
1ère correspondance: "Du texte avec un titre : <h1>super titre</h1>"
2nde : "et un second titre, mais vaux mieux cliquer <a href="lien du titre ici"> sur ce titre ci </a>"
3ème : "pour un meilleur titre"
(quand on trace tout l'algo, il y en a même une 4ème, complètement vide)
Résultat : 'Du texte avec un PAF : <h1>super titre</h1> et un second PAF, mais vaux mieux cliquer <a href="lien du titre ici"> sur ce titre ci </a> pour un meilleur PAF'
Dans la fct anonyme, $match[1] vaut ce qu'il y a avant les balises, ou le reste de la chaîne (selon que l'on trouve ou non les balises voulues). Donc c'est sur lui que j'applique la substitution utile. Pour info, $match[2] est la suite de la chaîne (une chaîne vide si on arrive à la fin). Et dans le cas où l'on trouve les balises, $match[3] $match[4] $match[5] sont la balise ouvrante, le contenu et la balise fermante (la décomposition de $match[2]).
Appliqué à la 1ère correspondance:
$match[1]="Du texte avec un titre : "
$match[2]="<h1>super titre</h1>"
$match[3]="<h1>"
$match[4]="super titre"
$match[5]="</h1>"
J'avoue être surpris que ça marche. J'ai ajouté l'alternative avec $ sans y croire, mais ça fonctionne (encore une fois, sur ton exemple).
$pattern = '/(.*?)((<h1>|<a)(.*?)(<\/h1>|<\/a>)|$)/s';
$texte=preg_replace_callback($pattern, function($match) {
return preg_replace('/titre/','PAF',$match[1]).$match[2];
}, $texte);
En fait, je m'intéresse à ce qu'il y a avant les balises (ici je me suis limité à h1 et a), ou à ce qu'il y a après toutes les balises. Et j'applique vraiment la substitution à ces sous-ensembles.
Si on le déroule sur ton exemple :
Entrée: 'Du texte avec un titre : <h1>super titre</h1> et un second titre, mais vaux mieux cliquer <a href="lien du titre ici"> sur ce titre ci </a> pour un meilleur titre';
1ère correspondance: "Du texte avec un titre : <h1>super titre</h1>"
2nde : "et un second titre, mais vaux mieux cliquer <a href="lien du titre ici"> sur ce titre ci </a>"
3ème : "pour un meilleur titre"
(quand on trace tout l'algo, il y en a même une 4ème, complètement vide)
Résultat : 'Du texte avec un PAF : <h1>super titre</h1> et un second PAF, mais vaux mieux cliquer <a href="lien du titre ici"> sur ce titre ci </a> pour un meilleur PAF'
Dans la fct anonyme, $match[1] vaut ce qu'il y a avant les balises, ou le reste de la chaîne (selon que l'on trouve ou non les balises voulues). Donc c'est sur lui que j'applique la substitution utile. Pour info, $match[2] est la suite de la chaîne (une chaîne vide si on arrive à la fin). Et dans le cas où l'on trouve les balises, $match[3] $match[4] $match[5] sont la balise ouvrante, le contenu et la balise fermante (la décomposition de $match[2]).
Appliqué à la 1ère correspondance:
$match[1]="Du texte avec un titre : "
$match[2]="<h1>super titre</h1>"
$match[3]="<h1>"
$match[4]="super titre"
$match[5]="</h1>"
J'avoue être surpris que ça marche. J'ai ajouté l'alternative avec $ sans y croire, mais ça fonctionne (encore une fois, sur ton exemple).