IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Regex


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Par défaut Regex
    Bonjour à tous,

    Je viens de faire un site pour un client.
    Ce site contient plein de news, d'articles et un lexique.
    Ce lexique contient les définitions de plusieurs mots (domaine de la voile).
    J'ai donc une table lexique contenant les mots et leurs définitions.

    Le but du lexique est de faire un lien sur chaque mot d'un article présent dans le lexique vers la page explicative

    Dans l'exemple ci dessous, $RowSQLArt['art_texte'] contient le texte de mes articles, voici comment je fait pour faire mes liens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "SELECT * FROM lexique";
    $SQL = mysql_query($sql) or die(mysql_error());
    $RowSQL = mysql_fetch_assoc($SQL);
     
    do {
    	$RowSQLArt['art_texte'] = preg_replace("!(".$RowSQL['lex_id'].")!i", "<a class='lexique' href='/lexique-de-la-voile.html#".$RowSQL['lex_id']."' title='".htmlentities($RowSQL['lex_des'])."'>$1</a>", $RowSQLArt['art_texte']);			
    } while ($RowSQL = mysql_fetch_assoc($SQL));
    Seulement les articles contiennent du HTML (liens, etc...).
    Donc si un article contient un lien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href='http://www.voile.com'>
    et que "voile" est un mot présent dans le lexique, ca me le transforme en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href='http://www.<a class='lexique' href='/lexique-de-la-voile.html#voile' title='blabla'>voile</a>.com'>
    C'est pas beau à voir ...

    Quelqu'un à une idée de fonctionnement qui corrigerais le problème ?

    Merci !

  2. #2
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Par défaut
    dans ton regexp, tu pourrais faire un truc qui prend les mots qui sont entourés d'ESPACE, de VIRGULE, ou de POINT ... un truc comme ca.

    ou avec le fait que si le Mot y a un < a gauche et > a droite c'est que c'est un lien.

    tu en penses quoi ??

  3. #3
    Membre chevronné Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Par défaut
    La deuxieme solution me parait parfaite !!

    Seulement je suis une biquette en expressions régulieres et j'ai bien passé 2h à pondre celle ci, donc si il y a une âme charitable qui ère sur le forum...

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Il me semble que ce genre de question (une regex qui remplace tout sauf ce qui est dans des tags HTML) a déjà été abordée plusieurs fois, si tu vois ce que je veux dire ^^

  5. #5
    Membre chevronné Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Par défaut
    Tu as entierement raison...

    C'est que je n'avais pas formulé mom problème comme "une regex qui remplace tout sauf ce qui est dans des tags HTML"

    Dis comme ça, je pense que je vais trouver mon bonheur !

    EDIT: J'ai trouvé (notamment plusieurs où tu as donné des soluces). Merci !

  6. #6
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Par défaut
    tu peux poster le code pour voir à quoi ca ressemble ...

  7. #7
    Membre chevronné Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Par défaut
    J'ai trouvé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function split_balise($on_recherche, $on_remplace, $subject, 'str_replace', $flag = 1)
    {
       $eval_fct = "mon_rplc('\$1', '\$2', \$de, \$par, '$fct', '$flag')";
       return preg_replace('#((?:(?!<[/a-z]).)*)([^>]*>|$)#ies', $eval_fct, $txt);
    }
    ou ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Le ou les mots clé, séparé par des |
    $kw="le|la";
     
    //Essaie #1:
    SubstituteText("(?(?=^)^([^<]*?)(".$kw.")([^<]*?)|(?=>)([^<]*?)(".$kw.")(.*?)?)","\\1\\4<span id=\"hlzone\" style=\"background-color:#DDDD00;\">\\2\\5</span>\\3\\6",$vlTmp,0x0401);
     
    //Essaie #2:
    SubstituteText ("(".$kw.")*(?(?=<)(<[^>]*>))(".$kw.")*";"<span id=\"hlzone\" style=\"background-color:#DDDD00;\">\\1\\3</span>\\2",$vlTmp,0x0401);
    Mais je n'ai pas encore testé...

  8. #8
    Membre chevronné Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Par défaut
    Si ça interesse quelqu'un, voici le code qui fonctionne (pompé chez un concurrent )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function mon_rplc_callback($capture){
    	  global $arg;
    	  return ($arg['flag'] == 1)
    	  ? $arg['fct']($arg['de'], $arg['par'], $capture[1]).$capture[2] : $capture[1].$arg['fct']($arg['de'], $arg['par'], $capture[2]);
    }
     
    function split_balise($de, $par, $txt, $fct, $flag = 1){
    	  global $arg;
    	  $arg = compact('de', 'par', 'fct', 'flag');
    	  return preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', "mon_rplc_callback", $txt);
    }
     
     
    $sql = "SELECT * FROM lexique";
    $SQL = mysql_query($sql) or die(mysql_error());
    $RowSQL = mysql_fetch_assoc($SQL);
    do {
    	$RowSQLArt['art_texte'] =  split_balise("!(".$RowSQL['lex_id'].")!i", "<a accesskey='' class='lexique' href='/lexique-de-la-voile.html#".$RowSQL['lex_id']."' title='".strip_tags($RowSQL['lex_des'])."'>$1</a>", $RowSQLArt['art_texte'], 'preg_replace', 1); 
    } while ($RowSQL = mysql_fetch_assoc($SQL));

Discussions similaires

  1. [Regex] Plusieurs motifs
    Par sissi_l dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 29/06/2004, 14h15
  2. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33
  3. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22
  4. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  5. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo