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 :

highlight d'un mot qui n'est PAS dans un tag html. [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut highlight d'un mot qui n'est PAS dans un tag html.
    Bonjour à tous,

    je recherche une expression rationelle qui permet de surligner les occurences d'un mot clé dans une source html.

    Le problème majeur que j'ai c'est que le terme ne doit pas être DANS une balise html.

    Exemple:
    Mot clé: le

    Le chien laisse les meubles intactes: <a href="www.leschiens.com">le lien</a> ... teste-le!
    Ce qui devrait donner SEULEMENT les mots que j'ai marqué en vert et PAS les mots marqué en rouge.

    Le chien laisse les meubles intactes: <a href="www.leschiens.com">le lien</a> ... teste-le!
    ... car l'étape suivante est de remplacer les mots trouvés par <span class="highlight">\1</span>


    Donc je n'arrive pas à créer un REGEX qui fonctionne bien.
    Pouvez-vous m'aider ?
    Merci.

  2. #2
    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
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Peut-être pourrais-tu splitter en utilisant les balises HTML et faire ton traitement à partir de ça ?

    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
    20
    21
    22
    23
    24
    25
    <?php
     
    ob_start&#40;&#41;;
     
    $string = 'a<center>b</center>c';
     
    if&#40;preg_match_all&#40;'/&#40;.*&#41;&#40;<.+>&#41;&#40;.*&#41;/U', $string, $matches, PREG_SET_ORDER&#41;&#41;&#123;
       //print_r&#40;$matches&#41;;
     
       foreach&#40;$matches as $i => $match&#41;&#123;
          echo "\n".$i."\n";
          echo '&#91;1&#93; &#58; '.$match&#91;1&#93;."\n";
          echo '&#91;2&#93; &#58; '.$match&#91;2&#93;."\n";
          echo '&#91;3&#93; &#58; '.$match&#91;3&#93;."\n\n";
       &#125;
    &#125;
     
    $contents = ob_get_contents&#40;&#41;;
    ob_end_clean&#40;&#41;;
     
    echo '<pre>';
    echo htmlentities&#40;$contents&#41;;
    echo '</pre>';
     
    ?>

  3. #3
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Non, le but est de tout faire en une seule ligne.

    le critère de remplacement serait quelque chose comme:
    \1<span>\2</span>\3

    j'ai quelque chose que je PENSE est fonctionnel mais je suis pas certain.
    Et dans le regex que tu donne, il faut s'assurer de mettre un .+? car juste .+ ca va prendre le premier < jusqu'au dernier >

  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
    Points : 29 985
    Points
    29 985
    Par défaut
    Citation Envoyé par FMaz
    Et dans le regex que tu donne, il faut s'assurer de mettre un .+? car juste .+ ca va prendre le premier < jusqu'au dernier >
    Je crois comprendre que tu n'as pas essayé mon expression. En effet, j'ai mis le modificateur U : mon expression ne prendra pas tous les caractères jusqu'au dernier mais s'arrêtera dès qu'elle le pourra (en l'occurence, au premier < ou >).
    Le seul souci que je vois est qu'elle ne récupère rien après la dernière balise.

  5. #5
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Le language que j'utilise ne supporte pas les modificateur en fin d'expression.
    C'est d'ailleurs pour cela que ca me prend une seule expression qui fera tout.

    --> Tu est dans le forum PHP!
    Oui mais le language en question n'est pas sur ce forum et ma question étaient uniquement sur le regex. Une alternative en plusieurs lignes ne fonctionnera donc pas. Je veux juste une expression rationnelle, ce qui est relativement identique partout.

    pour les raisons technique, j'ai besoin d'avoir un regex qui tiendra sur une ligne, pas un ensemble d'instructions.

    Une utilisation du genre:
    remplacement (regex, "\1<span>\2</span>\3",codehtml);

    Je pense que j'ai réussit, mais je teste encore pour vérifier, je vais poster le regex en question dès que je serais au bureau pour que tu puisse voir si je suis dans le champs ou si ca tiend la route.

  6. #6
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Voilà ce que je suis arrivé à faire (syntaxe mise en PHP pour plus de clareté):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Le ou les mots clé, séparé par des |
    $kw="le|la";
     
    //Essaie #1&#58;
    SubstituteText&#40;"&#40;?&#40;?=^&#41;^&#40;&#91;^<&#93;*?&#41;&#40;".$kw."&#41;&#40;&#91;^<&#93;*?&#41;|&#40;?=>&#41;&#40;&#91;^<&#93;*?&#41;&#40;".$kw."&#41;&#40;.*?&#41;?&#41;","\\1\\4<span id=\"hlzone\" style=\"background-color&#58;#DDDD00;\">\\2\\5</span>\\3\\6",$vlTmp,0x0401&#41;;
     
    //Essaie #2&#58;
    SubstituteText &#40;"&#40;".$kw."&#41;*&#40;?&#40;?=<&#41;&#40;<&#91;^>&#93;*>&#41;&#41;&#40;".$kw."&#41;*";"<span id=\"hlzone\" style=\"background-color&#58;#DDDD00;\">\\1\\3</span>\\2",$vlTmp,0x0401&#41;;

    Bon, je sais que ce n'est pas une fonction PHP, mais le regex et la facon de l'utilisé reste la même. Et ce genre de regex (s'il est bon), est extrèment pratique pour faire des script de surlignage dans une page. (Comme dans GMail).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] pour ce qui n'est pas dans le body ?
    Par ricault dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/06/2007, 16h21
  2. Récupérer tout ce qui n'est pas dans la base
    Par SnakeBoudoir dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/11/2006, 20h18
  3. Trouver une valeur qui n'est pas dans un champ
    Par eric41 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 17h48
  4. Importer un .py qui n'est pas dans le rep courant
    Par Mr Hyde dans le forum Général Python
    Réponses: 5
    Dernier message: 25/08/2005, 18h30

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