Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-03-2009 16:46:17

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Regex particulière, je bloque !

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.


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#2 28-03-2009 17:48:58

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Regex particulière, je bloque !

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

 

#3 28-03-2009 18:03:49

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Regex particulière, je bloque !

Mais je peux cumuler plusieurs "tests" ? Ni dans lien, ni dans image, correspondant à mes filtres issues de la BDD ?


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#4 28-03-2009 20:54:05

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Regex particulière, je bloque !

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

 

#5 28-03-2009 22:40:58

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Regex particulière, je bloque !

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.


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#6 29-03-2009 11:05:39

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Regex particulière, je bloque !

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.

Code:

<?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;
    }    
}

Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#7 30-03-2009 10:45:38

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Regex particulière, je bloque !

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 ) :

Code:

$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 ?


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages