Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
je viens à votre secours car je bloque sur une Regex assez particulière, j'espère avoir l'autorisation d'utiliser cette tribune libre pour réclamer de l'aide !
En gros, j'ai une table avec des relations "expression" => "lien". En gros, dans cette table, j'ai des valeurs du style "tortue" => "/fiche/animal.php", "lapin bleu" => "/fiche/animal.php".... (je prends des exemples hein...)
Ce que je veux, c'est ça :
Dans un texte de mon site, je veux pouvoir, quand une des expressions de la table est présente dans le texte, créer un lien automatique (vers le lien dans la relation, forcément).
Mais, comme il y a toujours un mais, le lien automatique ne doit pas se faire si l'expression est déjà présente dans un lien (logique), et si l'expression est présente dans une balise image (si y'a le mot tortue dans le lien d'une image présente dans le texte, forcément il ne faut pas toucher).
Voilà donc mon problème, je me casse la tête dessus depuis ce matin, mais je ne vois pas comment faire.
Quelqu'un a un début de piste à me proposer ? Merci d'avance.
Hors ligne
preg_match('/[^<a.*>(.*)</.*>]/i', $toto)
un truc du genre doit matcher tout ce qui n'est pas un lien
je fais ça de tête
je te conseille http://fr.wikipedia.org/wiki/Expression_rationnelle
et http://regexpr.com/
attention ce dernier test les expression régulière compatible perl donc à utiliser avec preg_match et non ereg_match
A+JYT
Hors ligne
oui tu peux faire des ET et de OU
par exemple
/<a|<img/i matche les tag A et IMG
/<a .*>.*</a>|<img.*>/i va capturer <a href="toto">truc</a> ou <img src="machin" /> ou <a name="test">truc</a>
je te conseil de faire ça par étape préparer des morceau d'expressions simples que tu assemble ensuite.
A+JYT
Hors ligne
Ok merci. Dernière question ? Comment faire une négation ? Car le but final est de récupérer toutes les correspondances, sauf quand elles sont dans les <a></a> et <img />.
Merci pour les infos.
Hors ligne
Bon, j'avance un peu, les images sont ignorées, mais je coince sur plusieurs trucs :
- ignorer si on est dans un lien (ton exemple, sekaijin, ne fonctionne pas)
- les virgules, collées aux mots filtrés, se retrouve dans le lien
- Je n'arrive pas à faire en sorte que le filtre soit exécuté uniquement sur un mot complet : l'outil est pour ce site : http://www.planete-asm.fr, c'est pour mettre des liens automatiques vers les fiches des joueurs. Seulement, pour le joueur "Pino", le lien matché est "Pi" pour http://www.planete-asm.fr/joueur/189-jessy-pi.html et non "Pino" pour http://www.planete-asm.fr/joueur/120-ju … -pino.html
Ci dessous, mon code, je ne demande pas à ce que l'on me donne la solution toute faite, mais si quelqu'un peut déjà me dire si je suis parti dans le bon sens, et me donner des conseils pour les trois points énumérés ci-dessus, ce serait très sympa.
Merci.
<?php class JoueursFiltres extends Zend_Db_Table_Abstract { var $_name = 'joueurs_filtres'; /** * Filtre pour liens automatiques vers fiche joueurs * * @param text $texte */ public static function filters($texte) { //Récupération de la liste des joueurs et mise en cache $cache = Kermit_Cache::initialization(86400); if(!$list = $cache->load('JoueursList')) { $table = new JoueursFiltres(); $query = $table->select()->setIntegrityCheck(false) ->from('joueurs_filtres') ->joinleft('joueurs', 'joueurs.id = joueurs_filtres.joueur_id', array('link' => 'link')); $list = $table->fetchAll($query); $cache->save($list, 'JoueursList'); } foreach($list as $item){ $texte = preg_replace('/' . $item->filtre . '[^<img.*>]/si', '<a href="' . $item->link . '">$0</a>', $texte); } return $texte; } }
Hors ligne
J'ai un peu avancé, mais j'ai un soucis étonnant (celui qui fait que les virgules après les mots sont prises dans les liens ) :
$texte = preg_replace('/' . $item->filtre . '[^<img.*>]/si', '<a href="' . $item->link . '">$0</a>', $texte);
Je dois mal indiquer le fait que je ne veux pas d'image. Car en fait, du coup, il me match le filtre + 1 caractère. Si je rajoute 5 fois "[^<img.*>]" il me matchera le filtre + 5 caractères ! Comment faire pour appliquer le "pas d'image" sans qu'il ne rajoute des captures de caractères ?
Hors ligne