Bonjour à vous.

Actuellement je travaille sur un outil permettant d'insérer des liens à la volée dans un contenu html et je bloque sur un élément clé. Si le contenu contient le mot "Toto" par exemple, je le remplace bien entendu par un lien. Je fais en sorte que le remplacement ne se fasse qu'une fois pour éviter de générer trop de liens. Mon soucis se trouve sur le fait que si un attribut (alt ou title) d'une image ou d'un autre lien contient ce mot cléf, alors l'outil m'insère un lien dans l'attribut... Ce qui n'est pas bon... Et je vous avouerais que je m'arrâche les cheveux avec ma regex depuis quelques heures pour que ça colle bien.

Voici un exemple type d'un block HTML qui coince :

<a class="inserer_lien_article" href="http://www.local.app/news/pro-d2--usap-jean-pierre-perez-vide-sac-francois-riviere-taille-costard-2805161419.php" alt="Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard" title="Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard"><span class="fleche"></span><img src="http://www.local.app/photos/thumbs/usap-jean-pierre-perez-vide-son-sac-francois-riviere-lui-taille-un-costard-2016-05-28.jpg" /><span class="titre_article_lien">Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard </span></a>

Et Voici Actuellement ma regex pour le mot cléf USAP :

/(title="([\w\s\d]+)?USAP([\w\s\d]+)?")/

Je ne suis bien entendu pas très doué en regex, donc si quelqu'un a une solution à me proposer je suis preneur =)

Merci à vous !

11 réponses


AlexJM
Réponse acceptée

Sinon, avec ceci:

((?:<|>)?)([^<>]*)(USAP)([^><]*)

Tu peux voir le groupe 1, si dans le groupe un tu as un < c'est que t'es dans uen balise, sinon tu as soit rien soit un >
Ensuite pour avoir la position du USAP, tu prends la position que tu viens de trouver, plus la position du groupe un plus la position du groupe deux

C'est le mieux que j'ai trouvé avec les fonctionnalités de php ;)

Bonsoir.
As-tu visionné le tutoriel Les expressions régulières ?
Car il donne justement comme exemple par rapport au lien à une image, tu y verras donc par rapport aux attributs supplémentaires dans une balise.
Donc, à partir de ça, tu devrais pouvoir résoudre ton problème.

Non merci mais je sais faire des expression régulières, tu te doutes bien qu'avant de venir poster j'ai regardé de nombreux tutos, de nombreux pots sur des forums, si je poste c'est que justement je bloque et qu'un tuto ne m'aidera pas plus...

Je dois certainement faire quelque chose de mal, ou une erreur, je regarderais à nouveau demain à tête reposée ça aidera sûrement, mais ton post ne m'aide absolument en rien...

Merci quand même.

Peux-tu donner un lien qui fonctionne ? Car je n'ai pas trop compris ce que tu cherches à faire :/

Si tu cherches à avoir la valeur de l'attribut title:

/(title="([^"]+)?USAP([^"]+)?")/

Yop..

Essaye d'abord de vérifier si ton contenu a des balises, les enlever du contenu (les mettres en mémoire, je sais pas) puis ensuite de remplacer le mot clé "toto" par ton lien, et ensuite remettre les balises à leur place ?

Exemple avec le contenu suivant:

Je voudrais récupérer le mot clé USAP mais USAP ne doit pas être dans une balise HTML.
Par exemple ce contenu ne doit pas être matché: <a class="inserer_lien_article" href="http://www.local.app/news/pro-d2--usap-jean-pierre-perez-vide-sac-francois-riviere-taille-costard-2805161419.php" alt="Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard" title="Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard"><span class="fleche"></span><img src="http://www.local.app/photos/thumbs/usap-jean-pierre-perez-vide-son-sac-francois-riviere-lui-taille-un-costard-2016-05-28.jpg" /><span class="titre_article_lien">Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard </span></a> ET <a class="inserer_lien_article" href="http://www.local.app/news/pro-d2--usap-jean-pierre-perez-vide-sac-francois-riviere-taille-costard-2805161419.php" alt="Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard" title="Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard"><span class="fleche"></span><img src="http://www.local.app/photos/thumbs/usap-jean-pierre-perez-vide-son-sac-francois-riviere-lui-taille-un-costard-2016-05-28.jpg" /><span class="titre_article_lien">Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard </span></a>

Les étapes:
1) Stocker toutes les balises dans un tableau, et les remplacer dans le contenu par son index du style:

$gardeLiens = [0 => '<a class="inserer_lien_article" href="http://www.local.app/news/pro-d2--usap-jean-pierre-perez-vide-sac-francois-riviere-taille-costard-2805161419.php" alt="Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard" title="Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard"><span class="fleche"></span><img src="http://www.local.app/photos/thumbs/usap-jean-pierre-perez-vide-son-sac-francois-riviere-lui-taille-un-costard-2016-05-28.jpg" /><span class="titre_article_lien">Pro D2 - USAP. Jean-Pierre Perez vide son sac, François Rivière lui taille un costard </span></a>', '1' => ...]

Je voudrais récupérer le mot clé USAP mais USAP ne doit pas être dans une balise HTML.
Par exemple ce contenu ne doit pas être matché: {0} ET {1}

2) Maintenant remplacer le mot clé "USAP" par tes liens:

Je voudrais récupérer le mot clé <a href="#">USAP</a> mais <a href="#">USAP</a> ne doit pas être dans une balise HTML.
Par exemple ce contenu ne doit pas être matché: {0} ET {1}

3) Remettre les balises stockées à leur place:

Je voudrais récupérer le mot clé <a href="#">USAP</a> mais <a href="#">USAP</a> ne doit pas être dans une balise HTML.
Par exemple ce contenu ne doit pas être matché: $gardeLiens[0] ET $gardeLiens[1]

@PhiSyX c'est pas bête en effet je n'y avais pas pensé ! Je testerais ça la semaine prochaine du coup, là je fais le pont =) Mais merci je te tiens au courant !

@AlexJM Désolé pas de lien, je bosse en local pour cette partie mais voici un exemple. Sur ce lien, dans le corps de l'article, tu pourras remarquer le mot essai est un lien pointant vers une page spécifique. Ceci est généré à l'aide d'un parser qui me permet de transformer certains mots (lors de la rédaction) en lien. Le soucis c'est que je ne veux pas que ce parssage s'effectue lorsque ce mot clé est l'attribut alt ou title d'un lien (ou d'une image).

En fait je tentais de faire une regex pour déterminer si le mot clé recherché se trouve dans l'attribut alt ou title d'un lien. De sorte que

Le mot USAP que je recherche se trouve dans une phrase normale // => OK donc traitement
<a href="#" alt="le mot clé USAP se trouve dans un attribut">Lien</a> // => Pas bon, pas traitement

Ah je vois j'ai compris, tu dois le faire obligatoirement en php ?

Vu que c'est pendant une soumission de formulaire, oui

Tu peux tenter quelque chose comme ceci :

USAP(?![^<]*">)

Mais je sais pas si les lookahead fonctionnent en php

Je te remercie ça marche parfaitement comme ça ;)

Pas de prob ;)