Aller au contenu

preg_replace ()


mac97000

Sujets conseillés

Bonjour à tous,

habituellement je fini toujours pas trouver moi même la solution en cherchant sur les différents forum et site internet très complet ...

ce qui me permet également d'enrichir mes connaissances en tombant sur des info que j'ignorais, mais la rien :sad:

Mon problème est pourtant très simple.

J'utilise la fonction preg_replace pour les besoins de l'un de mes sites.

Je l'alimente grâce à une base de donnée dans laquelle je défini les mots (ou expression) à remplacer par leur équivalent en lien cliquable.

Je me trouve donc face au schéma: "mot" = <a href="mot_url title="mot_title">mot_texte</a>

c'est un peu plus de travaille mais pour chaque mot je redéfini le texte ce qui à 2 avantages:

- je ne suis pas obligé de changé exactement "mot" en "mot" cliquable

- en ayant un seul "mot" dans ma table je peux lui donner plusieurs valeurs " mot | mots | mota | motas | mtos" ...

tout cela n'est bien évidement que des exemples, le code fonctionne très très bien même trop bien et voilà mon problème :!:

En effet, comme je rempli toutes mes balises "alt" et "title" mon fameux preg_replace est capable d'allez me trouver un mot dans les balises alt et title pour le rendre cliquable.

Une balise avec un mot cliquable dedans ne ressemble plus à rien et fait planter le reste de ma page.

Si vous aviez une piste vers laquelle m'orienter pour corriger cette anomalie je vous en serais très reconnaissant.

Merci d'avance et bonne journée à tous ;-)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Si je comprend bien, tu parcours ton code et tu remplaces toutes les occurences de "mot" par "<a href=........>....</a>"

Et ton probleme vient du fait que tu ne remplaces pas que le contenu mais aussi le code du/des conteneurs (des balises quoi).

Il suffit donc de dire qu'il ne faut remplacer que les élément entre la fermeture d'une balise (>) et l'ouverture d'une nouvelle (<)

Une fonction eval qui :

- Si la chaine contient une balise, donc si elle match l'expression reguliere suivante : (.*)<.*?>(.*)

Elle evalue les 2 chaines extérieures de la balise (par recursivité sur elle meme)

- Si la chaine ne match pas... eh bien tu peux remplacer

C'est sans doute un peu lourd mais en 5 minutes c'est tout ce que j'ai trouvé :D

Lien vers le commentaire
Partager sur d’autres sites

C'est sans doute un peu lourd mais en 5 minutes c'est tout ce que j'ai trouvé :D

Merci de prendre le temps de te pencher sur la question ...

Lourd pas forcément comme c'est une fonction, une fois qu'elle est écrite on ne reviens pas dessus et basta :whistling:

Effectivement je vais regarder de ce côté la.

On m'a proposé un test arrière négatif sur "alt" et "title", je vais voir lequel est le plus simple à mettre en oeuvre :rolleyes:

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

J'ai un souci sur cette meme fonction ( preg-replace) que je n'arrivepas a utiliser...

mon probleme se situe sur la réecriture de texte .

En effet j'aimerai remplacer tous les caractères accentués par la lettre equivalente non accentué ( é=e) etcc... et les espace par des tirets (-)

j'ai trouvé un code permettant de le faire mais j'aimerai l'optimiser par la fonction preg-replace car c'est plus rapide et plus puissant.

si quelqu'un a une idée sur la chose ça serait sympa

merci :)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à ceux qui liront ce post par la suite.

Le problème est résolu avec le code sous la forme complètement bidouille qui va suivre.

Pour faciliter la compréhension, j'ai complètement éclaté le code pour qu'il soit plus simple à commenter.

Dans un premier temps je défini tout les mots et expression dans une base de donnée mais la n'est pas le problème je passerais donc sur cette étape.

Puis je défini le texte qui viendra dans ma balise "title" je le converti en MB_CASE_TITLE

ce qui veut dire que tous les mots de la phrase commenceront par une majuscule ! (très utile pour la suite).

$tintin	   ="tout savoir sur milou et tintin le capitaine la sardine et le professeur tournesol";
$tintin = mb_convert_case($tintin, MB_CASE_TITLE, "UTF-8");

Ce qui donnera le résultat :

Tout Savoir Sur Milou Et Tintin Le Capitaine La Sardine Et Le Professeur Tournesol

Bien sur vous ne le verrez pas puisque c'est une balise "title" mais comme ça le preg_replace ne touchera plus au mot dans title puisque nous le rendrons sensible à la casse plus loin !

C'est maintenant que la bidouille intervient j'ai essayé en long en large et en travers pas moyen de lui dire de ne trouver que le mot

(mêm avec \b il plantait ...)

J'ai du faire une bidouille et pour qu'il ne surligne pas l'espace après le mot remplacé (dans le cas ou vos liens hypertextes sont souslignés)

On replace le "title" dans l'url complète puisqu'il n'est pas question de faire subir le MB_CASE à notre URL ...

La variable "$tintin" viendra donc remplacer le mot "tintin" dans le texte mais ne touchera pas au "Tintin" du "title" ni à l'éventuel "/tintin/" ou "/tintin.htm" qui pourrait se trouver dans notre url !

// pour que la regex fonctionne bien penser à l'espace après le </a> 
$tintin ='<a href="../tintin/fiche-tintin.htm" title="'.$tintin.'">tintin</a> ';

Un petit texte bidon pour tester la chose ...

à vous de coder $milou, $capitaine, $tournesol pour bien voir que tout fonctionne ...

$text = 'Allez capitaine même milou est loin devant nous et ne parlons pas de tournesol... <br />
maintenant que tintin trâce la route le capitaine et le professeur tournesol n\'en veut plus à milou d\'avoir mangé ses chaussurses<br />
Pourtant tintin est sur que le capitaine fait encore des reproches à milou dans sa barbe, tandis que le professeur tournessol a 2 longueurs de retards.<br>
Les pauvres jambes du professeur tournessol et dire que milou ne lui lache pas les baskets même si tintin le sermonne pour faire bonne figure devant le capitaine.<br/>
Non d\'une pipe de vieux bandits, ce milou est encore allé dans la chambre du capitaine malgré que tintin lui est interdit l\'accès.
Sacré milou, tintin ne peut pas le surveiller en permanence et le capitaine va finir par voir rouge.';

Et le plus compliqué, la regex qui ira chercher tous les mots à remplacer mais qui ne touchera pas à ces même mots si ils sont dans un "href" un "alt" un "title" ou tout autre balise ...

$pattern = '#(?<!([a-zA-Z]\="[a-zA-Z]"){2})(tintin )#';
$text = preg_replace($pattern, $tintin, $text);

Bien penser au petit espace après le mot à remplacer.

Il y a certainement mieux et plus simple, mais c'est la première fois que je fais joujou avec des regex et avec un test arrière négatif

Pour en savoir plus sur la méthode c'est dans cette direction qu'il faut chercher ( regex et test arrière négatif)

Voila le post est résolu pour ma part :whistling: .

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...