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 :

Explode / split ou autre, garder le délimiteur. [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut [Nouveau problème] Preg_replace, comparaison de chaine de caractères ?
    Bonjour tout le monde,
    J'aurais encore besoin de votre aide.
    Je me suis rendu compte qu'il y avait une faille dans mon application.
    Mon appli sert à mettre des balises autour de mots.
    Les mots sont contenus dans la base de données.
    Alors mon problème :

    Déjà d'une, j'avais trouvé peu intuitif de supprimer les balises avant de les remettre mais le soucis c'est que ça marche que si il n'y a qu'une balise autour du mot.
    En effet, si le mot c'est <strong><em>voiture</em></strong>
    Il supprimera que em, pas strong :/

    De deux, chuis bloqué pour les liens, je ne sais pas comment supprimer un lien déjà existant tout en ignorant la casse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     
    	 			$text[$v]=preg_replace('`\b<'.$balise.'>'.$key[$v].'</'.$balise.'>\b`i','$0',$text[$v],$occurence);				
    								 $text[$v]=preg_replace('@'.$key[$v].'@i','<'.$balise.'>$0</'.$balise.'>',$text[$v],$occurence);				
     
     
    									$text[$v]=preg_replace('`'.$key[$j].'`i','<a href= '.$url[$j].' >'.$key[$j].'</a>',$text[$v]);
    Merci d'avance pour votre aide, j'en peux plus avec ces expressions régulières, j'y pige rien.

  2. #2
    Membre éclairé
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Points : 835
    Points
    835
    Par défaut
    Salut,
    Je ne comprends pas ce que tu cherches à faire.

    Je pense que faire un preg_replace serait beaucoup beaucoup mieux que un explode, rajouter tes balises et ton mot clé...

    Z.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Zwiter Voir le message
    Salut,
    Je ne comprends pas ce que tu cherches à faire.

    Je pense que faire un preg_replace serait beaucoup beaucoup mieux que un explode, rajouter tes balises et ton mot clé...

    Z.
    Pour remplacer le mot clé, j'utilise preg_replace.

    Mais mon application me demande aussi d'alterner les balises.
    C'est-à-dire :

    Voici le texte que je veux modifier :

    "Ceci est ma voiture. VoituRe, très jolie."


    Donc pour le premier mot "voiture", j'aimerais y mettre la balise strong et pour le second, la balise em.

    Le problème, c'est que preg_replace malgré le fait qu'on peut ajouter une limite, il commencera toujours à la première position.
    Donc, pour éviter ce problème, j'avais découpé mon texte en fonction du mot clé.
    Le problème, c'est que je ne peux pas récupérer le délimiteur, au mieux, je peux rajouter, le mot clé voiture contenu dans ma BDD ( mais là, ça serait voiture à place de VoituRe, ce que je ne veux pas vu que je veux conserver la casse ).

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Donc voilà, le mieux, ça serait que je puisse garder le délimiteur en conservant la casse, est ce possible ?
    Si oui comment ?
    preg_split peut faire ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <pre>
    <?php
     
    $texte = 'Si par exemple, le mot contenu dans la BDD est voiture, il doit quand même me remplace VOituRE. Est-ce que le mot voiturette doit-être coupé?';
    print_r(preg_split('@(voiture)@i', $texte, -1, PREG_SPLIT_DELIM_CAPTURE));
     
    ?>
    </pre>
    Si le mot voiturette ne doit pas être coupé, il faut ajouter des \b comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <pre>
    <?php
     
    $texte = 'Si par exemple, le mot contenu dans la BDD est voiture, il doit quand même me remplace VOituRE. Est-ce que le mot voiturette doit-être coupé?';
    print_r(preg_split('@\b(voiture)\b@i', $texte, -1, PREG_SPLIT_DELIM_CAPTURE));
     
    ?>
    </pre>
    Citation Envoyé par nono662 Voir le message
    Mais mon application me demande aussi d'alterner les balises.
    preg_replace_callback est peut-être mieux adaptée pour répondre à l'ensemble de ton besoin.

    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
    26
    <?php
     
    function mon_remplacement($texte, $mot=false)
    {
      static $style = false;
      static $prototypes = array(
                    '<strong>%s</strong>',
                    '<em>%s</em>',
                  );
      if (is_string($texte) && is_string($mot) && $mot) {
        $style = true;
        $regex = sprintf('@\b(%s)\b@i', preg_quote($mot));
        return preg_replace_callback($regex, __FUNCTION__, $texte);
      }
      if (is_array($texte) && $mot === false && isset($texte[1])) {
        $style = !$style;
        return sprintf($prototypes[$style], $texte[1]);
      }
      return $texte;
    }
     
    $texte = 'Si par exemple, le mot contenu dans la BDD est voiture, il doit quand même me remplace VOituRE. Est-ce que le mot voiturette doit-être coupé?';
     
    echo mon_remplacement($texte, 'voiture');
     
    ?>

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Merci, jvais essayer ça.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Bonjour, j'ai un petit soucis :

    quand je tente ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text[$v]=preg_replace('@\bjoomla\b@i','<'.$balise.'>arsenal</'.$balise.'>',$text[$v],$occurence);
    Ca ne marche pas, ça fait comme si les \b ne marchaient pas, les aurais-je mal placés ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Tisha Carpenter Voir le message

    Si le mot voiturette ne doit pas être coupé, il faut ajouter des \b comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <pre>
    <?php
     
    $texte = 'Si par exemple, le mot contenu dans la BDD est voiture, il doit quand même me remplace VOituRE. Est-ce que le mot voiturette doit-être coupé?';
    print_r(preg_split('@\b(voiture)\b@i', $texte, -1, PREG_SPLIT_DELIM_CAPTURE));
     
    ?>
    </pre>


    ?>[/code]

    Cette fonction là m'intéresse mais comment n'afficher que le tableau des délimiteurs ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Un nouveau problème, merci de votre aide :jap:

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text[$v]=preg_replace('@\bjoomla\b@i','<'.$balise.'>arsenal</'.$balise.'>',$text[$v],$occurence);
    Ca ne marche pas, ça fait comme si les \b ne marchaient pas, les aurais-je mal placés ?
    Le 4ieme paramètre de preg_replace est pour limiter le nombre de remplacement, si $occurence est vide ou égal à 0, alors il y aura 0 remplacement. Sinon, il faut expliquer ce que tu entends par "les \b ne marchaient pas" avec un exemple de préférence.

    Citation Envoyé par nono662 Voir le message
    Cette fonction là m'intéresse mais comment n'afficher que le tableau des délimiteurs ?
    Pour extraire toutes les occurrences, preg_match_all est mieux adaptée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <pre>
    <?php
     
    $texte = 'Joomla est un outil, car joomla est un ensemble de scripts.';
    preg_match_all('@\bjoomla\b@i', $texte, $captures);
    print_r($captures);
     
    ?>
    </pre>

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Tisha Carpenter Voir le message
    Le 4ieme paramètre de preg_replace est pour limiter le nombre de remplacement, si $occurence est vide ou égal à 0, alors il y aura 0 remplacement. Sinon, il faut expliquer ce que tu entends par "les \b ne marchaient pas" avec un exemple de préférence.


    [/code]
    Par ils ne marchaient pas, je veux dire c'est comme si ils n'était pas présents, la fonction me coupe le mot.
    joomla.php devient arsenal.php :/

    Sinon peux regarder mon autre problème si ça ne te dérange pas, stp ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Par ils ne marchaient pas, je veux dire c'est comme si ils n'était pas présents, la fonction me coupe le mot.
    joomla.php devient arsenal.php :/
    Tu as un exemple ?

    Citation Envoyé par nono662 Voir le message
    Sinon peux regarder mon autre problème si ça ne te dérange pas, stp ?
    Citation Envoyé par Tisha Carpenter Voir le message
    Pour extraire toutes les occurrences, preg_match_all est mieux adaptée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <pre>
    <?php
     
    $texte = 'Joomla est un outil, car joomla est un ensemble de scripts.';
    preg_match_all('@\bjoomla\b@i', $texte, $captures);
    print_r($captures);
     
    ?>
    </pre>

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Tisha Carpenter Voir le message
    Tu as un exemple ?
    Non, pas là, le code est à mon école et j'ai oublié ma dernière version.

    Sinon merci pour la fonction, ça devrait m'aider.

    Par contre, comment faire pour règler mon problème de balise ? :/

  13. #13
    Invité
    Invité(e)
    Par défaut
    Alors à demain pour ton exemple

    Je comprends plus ou moins ton problème, mais peut-être que:

    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
    <style>
      em {background: yellow}
      strong {background: cyan}
    </style>
    <pre>
    <?php
     
    $texte = 'Joomla est un outil, car joomla est joomlaun ensemble de scripts.';
    $regex = '@\bjoomla\b@i';
    $occurrences = preg_match_all($regex, $texte, $captures, PREG_OFFSET_CAPTURE);
    print_r($captures);
     
    $balises = array('strong', 'em');
    for ($i=count($captures[0])-1; $i>-1; $i--) {
      $mot =& $captures[0][$i];
      $remplacer = sprintf('<%1$s>arsenal</%1$s>', $balises[$i%2]);
      $texte = substr_replace($texte, $remplacer, $mot[1], strlen($mot[0]));
    }
    echo $occurrences, ' remplacement(s)<br/>', $texte;
     
    ?>
    </pre>
    Désolée pour le style, j'ai quelques problèmes de visions ces temps-ci

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Merci, ça m'aide mais pas pour cette solution. :baby:

    Jt'embete vraiment trop, désolé.

    Mon plus gros soucis, c'est pour enlever ces balises d'un mot.

    Par exemple : <strong><em>arsenal</em></strong>

    Si j'ai pas de chance et que je veux enlever strong avant, bah ça marchera pas et vu que je veux pas forcément enlever toutes les balises, chuis un peu bloqué :/

    Encore merci pour tout.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Oups, j'étais certaine que tu voulais ajouter

    Il faut enlever les balises <em> et <strong> sur un mot clé et ce en alternance ?

    As-tu un exemple complet ? Il peut y avoir des attributs dans ces balises ?

    Donnes le plus d'explications possibles sur la tâche à effectuer.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Bah c'est pour optimiser une page.
    C'est à dire ajouter des balises à des mots clés.
    Pas forcément, em ou strong mais n'importe quelle balise.
    Donc avant de les ajouter, je dois vérifier qu'il n'y a pas déjà ces balises autour de ce mot.
    Si elles y sont déjà : bah soit, je les enlève, soit je fais rien ( mais ça je sais pas comment faire pour comparer une chaine :/ )

    Et après, je les mets autour :o

  17. #17
    Invité
    Invité(e)
    Par défaut
    J'ai vraiment été nulle sur ce coup

    Effectivement, en relisant tes messages et non pas quelques phases, tu avais assez bien exposé ton problème.

    Moi, j'aime faire un skip via preg_replace_callback sur les éléments HTML pour ne "rien faire". Par exemple, avec le mot "voiture" sur <strong>:

    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
    <?php
     
    function my_callback($occurrence)
    {
      if (empty($occurrence[1])) return $occurrence[0]; // ne rien faire
      return sprintf('<strong>%s</strong>', $occurrence[1]); // ajouter
    }
     
    $html = 'Si par exemple, le mot contenu dans la BDD est <strong><em>voiture</em></strong>, il doit quand même me remplace <em>VOituRE</em>. Une voiturette est une petite <strong>voiture</strong>? ';
     
    $regex = '@<strong[^>]*>.*?</strong>|\b(voiture)\b@si';
     
    echo preg_replace_callback($regex, 'my_callback', $html);
     
    ?>
    Le mot voiture sera capturé en $1 que si <strong>...</strong> ne l'est pas en $0 grâce au | (ou). D'où les return de $occurrence[1] et $occurrence[0] dans le my_callback. Donc si $occurrence[1] est vide, alors ne rien faire en retournant $occurrence[0], et sinon faire le remplacement en ajoutant <strong></strong> autour de $occurrence[1].

    J'aime aussi généraliser en encapsulant preg_replace_callback dans une fonction:

    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
    <?php
     
    function mon_remplacement($html, $mot=false, $balise=false)
    {
      static $tag = null;
      if (is_string($html) && is_string($mot) && is_string($balise)) {
        $tag = $balise;
        $regex = sprintf('@<%1$s[^>]*>.*?</%1$s>|</?[^>]+>|\b(%2$s)\b@si', $tag, $mot);
        return preg_replace_callback($regex, __FUNCTION__, $html);
      }
      if (is_array($html)) {
        if (empty($html[1])) return $html[0]; // ne rien faire
        return sprintf('<%1$s>%2$s</%1$s>', $tag, $html[1]); // ajouter
      }
      return $html;
    }
     
    $html = 'Si par exemple, le mot contenu dans la <a title="voiture">BDD est <strong><em>voiture</em></strong>, il doit quand même me remplace <em>VOituRE</em>. Une voiturette est une petite <strong>voiture</strong>? ';
     
    echo mon_remplacement($html, 'voiture', 'strong');
    echo '<hr/>', PHP_EOL;
    echo mon_remplacement($html, 'voiture', 'em');
     
    ?>
    Mais d'autres te suggérerons peut-être des assertions pour répondre à ton besoin.

    Bonne chance

    edit: ajout du skip sur les attributs des autres balises dans mon_remplacement().
    Dernière modification par Invité ; 23/06/2009 à 00h59.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Tisha Carpenter Voir le message
    J'ai vraiment été nulle sur ce coup

    Effectivement, en relisant tes messages et non pas quelques phases, tu avais assez bien exposé ton problème.

    Moi, j'aime faire un skip via preg_replace_callback sur les éléments HTML pour ne "rien faire". Par exemple, avec le mot "voiture" sur <strong>:

    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
    <?php
     
    function my_callback($occurrence)
    {
      if (empty($occurrence[1])) return $occurrence[0]; // ne rien faire
      return sprintf('<strong>%s</strong>', $occurrence[1]); // ajouter
    }
     
    $html = 'Si par exemple, le mot contenu dans la BDD est <strong><em>voiture</em></strong>, il doit quand même me remplace <em>VOituRE</em>. Une voiturette est une petite <strong>voiture</strong>? ';
     
    $regex = '@<strong[^>]*>.*?</strong>|\b(voiture)\b@si';
     
    echo preg_replace_callback($regex, 'my_callback', $html);
     
    ?>
    Le mot voiture sera capturé en $1 que si <strong>...</strong> ne l'est pas en $0 grâce au | (ou). D'où les return de $occurrence[1] et $occurrence[0] dans le my_callback. Donc si $occurrence[1] est vide, alors ne rien faire en retournant $occurrence[0], et sinon faire le remplacement en ajoutant <strong></strong> autour de $occurrence[1].

    J'aime aussi généraliser en encapsulant preg_replace_callback dans une fonction:

    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
    <?php
     
    function mon_remplacement($html, $mot=false, $balise=false)
    {
      static $tag = null;
      if (is_string($html) && is_string($mot) && is_string($balise)) {
        $tag = $balise;
        $regex = sprintf('@<%1$s[^>]*>.*?</%1$s>|</?[^>]+>|\b(%2$s)\b@si', $tag, $mot);
        return preg_replace_callback($regex, __FUNCTION__, $html);
      }
      if (is_array($html)) {
        if (empty($html[1])) return $html[0]; // ne rien faire
        return sprintf('<%1$s>%2$s</%1$s>', $tag, $html[1]); // ajouter
      }
      return $html;
    }
     
    $html = 'Si par exemple, le mot contenu dans la <a title="voiture">BDD est <strong><em>voiture</em></strong>, il doit quand même me remplace <em>VOituRE</em>. Une voiturette est une petite <strong>voiture</strong>? ';
     
    echo mon_remplacement($html, 'voiture', 'strong');
    echo '<hr/>', PHP_EOL;
    echo mon_remplacement($html, 'voiture', 'em');
     
    ?>
    Mais d'autres te suggérerons peut-être des assertions pour répondre à ton besoin.

    Bonne chance

    edit: ajout du skip sur les attributs des autres balises dans mon_remplacement().

    Ta fonction est parfaite sauf que quand je veux l'implémenter dans mon logiciel de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    							$text[$v]=$NO->mon_remplacement($text[$v],''.$key[$v].'',''.$balise.'');
    Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'mon_remplacement', to be a valid callback in C:\Program Files\wamp\www\optimisation\modules\siteNO.class.php on line 34
    Et je vois pas où est le problème vu que tous les paramètres sont remplis.

    ( je n'ai rien touché à ta fonction de base)

  19. #19
    Invité
    Invité(e)
    Par défaut
    C'est une fonction et non une méthode, donc la manière d'appeler est différente.

    Par contre c'est bien de travailler avec une classe, car ça permet de scinder les traitements et d'étendre les possibilités avec facilité. Par exemple: les tags <head>, <script>, <style> doivent probablement faire l'objet d'un skip. Et faire des méthodes pour ajouter/enlever des tags où il faut jamais faire de remplacement selon le besoin du moment, comme <b> sur <strong>.

    Un exemple de classe "bas de gamme" avec PHP5 pourrait-être:

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    <?php
     
    class OptimizeHTML
    {
      private $Tag;
      private $HTML;
      private $SkipTagsArray = array('head', 'script', 'style');
      private $SkipTagsString;
     
      function __construct($HTML)
      {
        $this->HTML = $HTML;
      }
     
      public function AddSkipTag($Tag)
      {
        if ( in_array(strtolower($Tag), $this->SkipTagsArray) === false ) {
          $this->SkipTagsArray[] = strtolower($Tag);
          $this->SkipTagsString = implode('|', $this->SkipTagsArray);
        }
      }
     
      public function RemoveSkipTag($Tag)
      {
        $skip = array_search(strtolower($Tag), $this->SkipTagsArray);
        if ($skip !== false) {
          array_splice($this->SkipTagsArray, $skip, 1);
          $this->SkipTagsString = implode('|', $this->SkipTagsArray);
        }
      }
     
      private function ReplaceCallback($Match)
      {
        // $Match[2] car maintenant $Match[1] sert aux tags à toujours exclures
        if (empty($Match[2])) return $Match[0];
        return sprintf('<%1$s>%2$s</%1$s>', $this->Tag, $Match[2]); 
      }
     
      public function AddTagToKeyword($Tag, $Keyword)
      {
        $this->Tag = $Tag;
        $SkipTags = sprintf('<(%s)\b[^>]*>.*?</\1>', $this->SkipTagsString);
        $regex = sprintf('@%1$s|<%2$s\b[^>]*>.*?</%2$s>|</?[^>]+>|\b(%3$s)\b@si',
                         $SkipTags,
                         $Tag,
                         $Keyword);
        $this->HTML =  preg_replace_callback($regex,
                                             array($this, 'ReplaceCallback'),
                                             $this->HTML);
      }
     
      public function GetHTML()
      {
        return $this->HTML;
      }
    }
     
    $html = 'Si par exemple, le mot contenu dans la <a title="voiture"/>BDD est
    <strong><em>voiture</em></strong>, il doit quand même me remplace
    <em>VOituRE</em>. Une voiturette est une petite <strong>voiture</strong>?
    Et <b>voiture</b> ne doit pas être encadrer par une balise strong car il y a
    déjà b!';
     
    $OptimizeHTML = new OptimizeHTML($html);
     
    $OptimizeHTML->AddSkipTag('b'); // pas de <strong> sur <b>
    $OptimizeHTML->AddTagToKeyword('strong', 'voiture');
     
    $OptimizeHTML->RemoveSkipTag('b'); // ré-authoriser <b>
     
    $OptimizeHTML->AddSkipTag('i'); // pas de <em> sur <i>
    $OptimizeHTML->AddTagToKeyword('em', 'voiture');
     
    echo $OptimizeHTML->GetHTML();
     
    ?>
    Le array($this, 'ReplaceCallback') est la manière d'appeler une méthode dynamique avec preg_replace_callback.

    Dans une logique classe, je n'hésiterais pas non plus à implémenter des méthodes comme LoadHTMLStream, LoadHTMLFile, SetHTML, GetSkipTags, SetSkipTags, etc... mais là c'est en dehors du sujet.

    Tout ce qui précède n'est qu'un exemple, tu es le seul responsable pour que ton code soit parfaitement adapté à ton besoin. Alors n'hésite pas à toucher au code, et si besoin, quelqu'un ici sera là pour te débloquer sur un aspect précis.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    Points : 10
    Points
    10
    Par défaut
    Je suis d'accord avec toi mais vu que ta fonction précédente répondait parfaitement à mon besoin, je suis frustré de pas pouvoir l'implémenter correctement avec un appel de fonction classique et je pige pas pourquoi.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Split et autre méthode sur "["
    Par Whatsyourname dans le forum Langage
    Réponses: 7
    Dernier message: 23/08/2011, 13h10
  2. Compter le nombre avec split au autre fonction
    Par ghir_ana dans le forum Langage
    Réponses: 1
    Dernier message: 27/07/2011, 20h28
  3. Explode Split strings
    Par Montor dans le forum Contribuez
    Réponses: 0
    Dernier message: 03/12/2009, 12h36
  4. fonction explode/split ?
    Par Seb33300 dans le forum C++
    Réponses: 12
    Dernier message: 18/04/2007, 13h28
  5. Réponses: 2
    Dernier message: 12/07/2006, 18h19

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