JeuWeb - Crée ton jeu par navigateur
Reg Ex - Remplacer des mots sauf entre certaines balises - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Reg Ex - Remplacer des mots sauf entre certaines balises (/showthread.php?tid=5592)

Pages : 1 2


RE: Reg Ex - Remplacer des mots sauf entre certaines balises - niahoo - 27-07-2011

c'est dans quel but au final ?

Car si tu dois multiplier les cas pour traiter les <a et <h1 puis un jour les <img, rajouter des patterns, changer les remplacements, etc. et bien je partirais sur ma première proposition, plus facilement évolutive sans effort.


RE: Reg Ex - Remplacer des mots sauf entre certaines balises - Wells - 27-07-2011

Le but est d'ajouter des lien a la place de mots dans un corps de texte.
Voici le code actuel qui gère les images en plus avec quelques cas spéciaux de traités:
Code :
        $Texte=str_replace('%20',' ',$Texte);
        $reg = '/href="(.*)\b'.$Cherche.'\b(.*)">(.*)\b'.$Cherche.'\b(.*)\<\/a\>/i';
        $Texte=preg_replace($reg, 'href="$1 '.md5($Cherche).' $2">$3 '.md5($Cherche).' $4</a>', $Texte);
        $reg = '/\<h1\>(.*)\b'.$Cherche.'\b(.*)\<\/h1\>/i';
        $Texte=preg_replace($reg, '<h1>$1 '.md5($Cherche).' $2</h1>', $Texte);
        $reg = '/alt="(.*)\b'.$Cherche.'\b(.*)"/i';
        $Texte=preg_replace($reg, '/alt="$1 '.md5($Cherche).'$2"', $Texte);
        $reg = '/title="(.*)\b'.$Cherche.'\b(.*)"/i';
        $Texte=preg_replace($reg, '/title="$1 '.md5($Cherche).'$2"', $Texte);
            
        $reg = '/(.*)\b'.$Cherche.'\b(.*)/';
        $Texte=preg_replace($reg, '$1'.$Remplace.'$2', $Texte);
        
        $Texte = str_replace(md5($Cherche),$Cherche,$Texte);
            
        return $Texte;



RE: Reg Ex - Remplacer des mots sauf entre certaines balises - Bertrand - 27-07-2011

Ca a l'air de pouvoir se faire avec des regex "imbriquées" (en tout cas ça marche sur ton 1er 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).