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. #41
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Mais j'ai oublié de te demander par rapport à la fonction que tu m'as montré hier, on peut mettre des limites comme avec preg_replace ?
    Mon dernier code devrait te donner l'inspiration pour faire cette modification toi-même.

  2. #42
    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
    Ce n'est pas faux :baby:

    Merci pour tout.
    Je lance tout ça demain et je te dis si ça marche.

  3. #43
    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
    Ca marche, merci beaucoup :o

    Mais sérieusement, ya vraiment aucun moyen de mettre à jour un lien sans que ça risque de nuire au reste ?

  4. #44
    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 encore un petit problème avec l'une des fonctions :

    Voilà, j'ai ces 6 textes à la base :

    text[0]= contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag ;

    text[1]=0

    text[2]=contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag

    text[3]=0

    text[4]=contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag

    text[5]=0
    J'utilise cette 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
    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
    $n=$NO->replace($mot,$balise[$t],$te,$url,$text,$occurence,$te,$b);
     
    public function replace($key,$balise,$a,$url,$text,$occurence,$i,$b){
     
    			$NO =new SiteNO();
    			$nombre=$occurence;
     
    			for($j=0;$j<$i;$j++){
    				 for($v=0;$v<count($text);$v++){					
     
    						if($j==$v){
     
    							 $text[$v]=$NO->mon_remplacement($text[$v],''.$key[$v].'',''.$balise.'',$occurence);
     
     
    								}
     
     
     
    								}
     
    						}
    					}
     
     
     
    				return $text;
     
     
    	} 
     
     
    //fonction mon_remplacement(...)
     
    public function mon_remplacement($html, $mot=false, $balise=false, $occurence=-1)
    {
     
      static $tag = null;
      if (is_string($html) && is_string($mot) && is_string($balise)) {
        $tag = $balise;
        $regex = sprintf('@<%1$s\b[^>]*>.*?</%1$s>|</?[^>]+>|\b(%2$s)\b@si', $tag, $mot);
        return preg_replace_callback($regex, array($this, 'mon_remplacement'), $html,$occurence);
      }
      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;
    }
    Au final, le nombre d'occurrences n'est pas le bon, je mets 15 en occurrences et ça donne :

    text[0]=<strong><em>contenu</em></strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong><em>contenu</em></strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a>


    text[1]=0


    text[2]=<a href="contenu.php">contenu</a> <strong><em>photo</em></strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> <strong><em>photo</em></strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> <strong>photo</strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> <strong>photo</strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> <strong>photo</strong> <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> photo <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> photo <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> photo <a href="tag.php">tag</a> <a href="contenu.php">contenu</a> photo <a href="tag.php">tag</a> <br />

    text[3]=0

    text[4]=<a href="contenu.php">contenu</a> <a href="photo.php">photo</a> <strong><em>tag</em></strong> <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> <strong><em>tag</em></strong> <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> <strong>tag</strong> <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag <a href="contenu.php">contenu</a> <a href="photo.php">photo</a> tag

    text[5]=0
    Je ne vois absolument pas d'où vient le problème.

  5. #45
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Au final, le nombre d'occurrences n'est pas le bon, je mets 15 en occurrences et ça donne
    ...
    Je ne vois absolument pas d'où vient le problème.
    Quel aurait été le bon résultat? Dans $text[0] il y a: 9 mots "contenu", 9 mots "tag" et 9 mots "photo". Alors faire un remplacement limité à 15 sur 9 mots "contenu" est équivalent à tout remplacer vu d'ici.

    Donc, tu veux probablement lier des comptes entre eux, mais je suis pas certaine si tu veux:
    • que tous les remplacements sur $text[0] soient limités à 15.
    • qu'un remplacement sur tous les morceaux de $text soit limité à 15.
    • ou les 2 possibilités en même temps.


    Dans tous les cas, il faudra ajouter un paramètre pour avoir un retour du nombre de remplacements effectués, qui pourra ensuite être enlevé de $occurence pour les remplacements suivants... selon le besoin.

    J'ai fait l'ajout de ce paramètre dans les 2 fonctions (j'ai renommé mon_remplacement en ajouter_tags). Avec un petit exemple pour lier les comptes des morceaux de $text entre eux, sur les 3 genres de remplacements que tu sembles faire.

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    <?php
     
    function ajouter_tags($html, $mot, $balises, $limite=-1, &$count=null)
    {
      // extraction
      $tags = implode('|', $balises);
      $skip_tags = sprintf('<(a|%s)\b[^>]*>.*?\b%s\b.*?</\1>', $tags, $mot);
      $regex = sprintf('@%s|</?([^>]+)>|\b%s\b@si', $skip_tags, $mot);
      $options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE;
      preg_match_all($regex, $html, $captures, $options);
     
      // éliminer les skips
      foreach ($captures as $index => $capture) {
        if (count($capture)>1) unset($captures[$index]);
        else $captures[$index] = $capture[0]; // conserver seulement la capture 0
      }
     
      // considérer la limite maximale de remplacements, -1 pour tous
      if ($limite > -1) $captures = array_slice($captures, 0, $limite);
      $count = count($captures); // retourner le nombre de remplacements fait
     
      // ajouter les balises en alternances
      $i = count($captures); // nombre de remplacement à faire
      $n = count($balises); // nombre de balises à alterner
      foreach (array_reverse($captures) as $capture) {
        $i--;
        $remplacer = sprintf('<%1$s>%2$s</%1$s>',
                             $balises[$i % $n],
                             $capture[0]);
        $html = substr_replace($html,
                               $remplacer,
                               $capture[1],
                               strlen($capture[0]));
      }
     
      // retour
      return $html;
    }
     
    function ajouter_lien($html, $mot, $url, $limite=-1, &$count=null)
    {
      // extraction
      $regex = sprintf('@<a\b[^>]+>.*?</a>|</?\w+[^>]+>|\b(%s)\b@si', $mot);
      $options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE;
      preg_match_all($regex, $html, $captures, $options);
     
      // enlever les non-remplacements qui étaient obligés pour émuler un "skip"
      foreach ($captures as $index => $capture) {
        // s'il n'y a pas de capture en $1, alors c'est un <a>...</a> ou attibuts
        // ref.: <a\b[^>]+>.*?</a>|</?\w+[^>]+>
        if (empty($capture[1])) unset($captures[$index]); // non-remplacement
        // sinon, c'est un mot du contenu: ref.: |\b(%s)\b
        else $captures[$index] = $capture[0]; // conserver seulement la capture 0
      }
     
      // considérer la limite maximale de remplacements, -1 pour tous
      if ($limite > -1) $captures = array_slice($captures, 0, $limite);
      $count = count($captures); // retourner le nombre de remplacements fait
     
      // faire les remplacements selon le contenu restant de $captures
      // array_reverse permet de conserver les offsets valides pour subst_replace
      foreach (array_reverse($captures) as $capture) {
        $remplacer = sprintf('<a href="%s">%s</a>',
                              $url,
                              $capture[0]); // le mot capturé en 0
        $html = substr_replace($html,
                               $remplacer,
                               $capture[1], // offset de remplacement en 1
                               strlen($capture[0]));
      }
     
      // retourer le HTML altéré
      return $html;
    }
     
    $text[0] = 'contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag';
    $text[1] = '0';
    $text[2] = 'contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag';
    $text[3] = '0';
    $text[4] = 'contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo tag';
    $text[5] = '0';
     
    $count = 0;
     
    // 15 remplacements max sur tous les morceaux, avec alternance <strong><em>.
    // passer les <a><strong><em> existants
    $occurrences = 15;
    foreach ($text as $index => $dummy) {
      if ($occurrences > 0) {
        $text[$index] = ajouter_tags($text[$index],
                                     'contenu',
                                     array('strong', 'em'),
                                     $occurrences,
                                     $count);
        $occurrences -= $count;
      }
    }
     
    // 15 remplacements <strong> max sur tous les morceaux
    // passer les <a><strong> existants
    $occurrences = 15;
    foreach ($text as $index => $dummy) {
      if ($occurrences > 0) {
        $text[$index] = ajouter_tags($text[$index],
                                     'contenu',
                                     array('strong'),
                                     $occurrences,
                                     $count);
        $occurrences -= $count;
      }
    }
     
    // 15 remplacements <a> max sur tous les morceaux
    // passer les <a> existants
    $occurrences = 15;
    foreach ($text as $index => $dummy) {
      if ($occurrences > 0) {
        $text[$index] = ajouter_lien($text[$index],
                                     'photo',
                                     'photo.php',
                                     $occurrences,
                                     $count);
        $occurrences -= $count;
      }
    }
     
    // voir le résultat HTML de ce qui précède
    echo '<pre>', print_r(array_map('htmlentities', $text), true), '</pre>';
     
    ?>
    Ces 2 fonctions deviennent de plus en plus identiques, à toi d'optimiser.

    Citation Envoyé par nono662 Voir le message
    Mais sérieusement, ya vraiment aucun moyen de mettre à jour un lien sans que ça risque de nuire au reste ?
    Si les morceaux sur lesquels tu travailles sont à l'origine des textes pures comme ton exemple semble montrer, alors il est facile de les ramener dans un état pure texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
    $html = '<strong><em>contenu</em></strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong><em>contenu</em></strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a> <strong>contenu</strong> <a href="photo.php">photo</a> <a href="tag.php">tag</a>';
     
    echo preg_replace('@</?\w+[^>]*>@s', '', $html);
     
    ?>

  6. #46
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    J'utilise cette 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
    public function mon_remplacement($html, $mot=false, $balise=false, $occurence=-1)
    {
     
      static $tag = null;
      if (is_string($html) && is_string($mot) && is_string($balise)) {
        $tag = $balise;
        $regex = sprintf('@<%1$s\b[^>]*>.*?</%1$s>|</?[^>]+>|\b(%2$s)\b@si', $tag, $mot);
        return preg_replace_callback($regex, array($this, 'mon_remplacement'), $html,$occurence);
      }
      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;
    }
    Je croyais qu'on avais abandonné preg_replace_callback car tu la trouvais trop compliquée ?

    Peu importe, la bonne implémentation d'une limite avec ce concept est plutôt.

    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
     
    public function mon_remplacement($html, $mot=false, $balise=false, $occurence=-1)
    {
      static $tag = null;
      static $count = 0;
      if (is_string($html) && is_string($mot) && is_string($balise)) {
        $tag = $balise;
        $count = $occurence;
        $regex = sprintf('@<%1$s\b[^>]*>.*?</%1$s>|</?[^>]+>|\b(%2$s)\b@si', $tag, $mot);
        return preg_replace_callback($regex, array($this, 'mon_remplacement'), $html);
      }
      if (is_array($html)) {
        if (!empty($html[1]) && $count) {
          $count--;
          return sprintf('<%1$s>%2$s</%1$s>', $tag, $html[1]); // ajouter
        }
        return $html[0]; // ne rien faire
      }
    
      return $html;
    }

  7. #47
    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
    Quand j'ai mis 15, c'était pour montrer que les 9 occurrences ne changeaient pas ( pour tag et photo, c'est le cas ) mais aussi que la deuxième balise ne s'appliquait plus :/
    Donc oui, je veux que quand je mets 15, toutes les occurences soient changées mais la première fonction buggue à ce niveau. :/

    Et non, je travaille pas sur du texte pur, il y aura déjà des balises :/

  8. #48
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Quand j'ai mis 15, c'était pour montrer que les 9 occurrences ne changeaient pas ( pour tag et photo, c'est le cas ) mais aussi que la deuxième balise ne s'appliquait plus :/
    Donc oui, je veux que quand je mets 15, toutes les occurences soient changées mais la première fonction buggue à ce niveau. :/
    J'avais finalement compris hier, d'où mon message en début de cette page 4 La modification à ton code est aussi dans ce message. L'explication est simple, il n'est pas possible de repasser le paramètre $occurence à preg_replace_callback comme limite, car la fonction compte aussi les skips.

    Citation Envoyé par nono662 Voir le message
    Et non, je travaille pas sur du texte pur, il y aura déjà des balises :/
    Je m'en doutais un peu

    Est-ce qu'il y a des différences entre les tags clients et les tags ajoutés qui pourrait être exploitées?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
    $html = '<em><strong>voiture</strong></em>, <strong>voiture familiale</strong>, <strong class="vitale">voiture</strong>';
    $regex = '@(?:<(em|strong)>)+(voiture)(?:</(?1)>)+@i';
    echo preg_replace($regex, '$2', $html);
     
    ?>
    Aurait tout de même le défaut de transformer (après les ajouts) un tag du client comme <strong>voiture</strong> en <em>voiture</em>.

    Sur le tag <a>, est-ce qu'il y a un pattern dans le href qui pourrait être exploité?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
    $html = '<a href="ajout">voiture</a>, <a href="client">voiture familiale</a>, <a href="client">voiture</a>';
    $regex = '@(?:<a href="[^"]+">)+(voiture)(?:</a>)+@i';
    echo preg_replace($regex, '$1', $html);
     
    ?>
    Le dernier <a> sera tout de même détruit, sauf si tu as des aspects dans le href qui pourraient aider à différencier le <a> client du <a> qui a été ajouté. Dans un de tes messages tu semblais dire qu'il n'y a aucun <a> du client, est-ce toujours le cas?

    Sinon, il y a la facilité d'un marqueur. Au lieu de remplacer "voiture" en <strong>voiture</strong> faire <!--M--><strong>voiture</strong>, donc facile à retrouver. Si ce <!--M--> est bloquant dans l'optimisation, il y a aussi la possibilité d'ajouter un attribut comme dir="LTR" ou lang="fr", etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $html = '<!--M--><a href="ajout">voiture</a>, <!--M--><em><!--M--><strong>voiture</strong></em>, <strong>voiture familiale</strong>, <strong class="vitale">voiture</strong>, <a href="client">voiture familiale</a>, une <strong>voiture</strong> du client <a href="client">voiture</a>';
     
    $regex = '@(?:<!--M--><(a|em|strong)\b[^>]*>)+(voiture)(?:</(?1)>)+@i';
    echo preg_replace($regex, '$2', $html);
     
    ?>
    Approcherait un bon résultat.

  9. #49
    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 en fait, si ya déjà un lien sur le mot voiture, ce n'est pas grave qu'il soit supprimé vu qu'il sera remplacé soit par le même lien soit par un nouveau lien contenu dans la BDD.
    Ce qui serait gênant, c'est que la fonction supprimerait tous les liens ( même ceux qui ne sont pas associés à un mot clé )

  10. #50
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Ce qui serait gênant, c'est que la fonction supprimerait tous les liens ( même ceux qui ne sont pas associés à un mot clé )
    Non, ce n'est pas un problème. On peut cibler sur le mot précis.

    Par contre, s'il y a 3 liens avec "voiture", on ne peut pas tous les enlever si l'ajout est limité à 2. Car le dernier lien serait détruit.

    Faut donc des destructions/ajouts synchonisés, pas de possibilité de nettoyage avant remplacement

    Et pour les tags <em> et <strong>, c'est grave de transformer <strong>voiture</strong> en <em>voiture</em> ? Ça serait le seul cas limite à mon avis.

  11. #51
    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
    Non, je pense que ça irait.
    Si déjà tout ça marche parfaitement, je serais heureux. Hier, j'ai bossé 10h d'affilée dessus sans trouver la solution.
    Merci beaucoup :o

  12. #52
    Invité
    Invité(e)
    Par défaut
    On commence à voir la lumière au bout du tunnel

    J'ai modifié ajouter_lien().

    Dans mon exemple, il y a 2 liens déjà existants <a href="client">tag</a> et je demande 3 remplacements maximum sur le mot "tag". Le résultat est 3 liens <a href="tag.php">tag</a> et 1 lien <a href="client">tag</a>... le premier lien a été changé (détruit/ajouté) car c'était le 2e mot "tag".

    Avant de faire l'autre fonction avec alternance de tags, je veux être certaine que c'est bien ce que tu veux.

    avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag
    après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu photo <a href="tag.php">tag</a> contenu photo <a href="tag.php">tag</a> contenu photo <a href="tag.php">tag</a> contenu photo tag contenu photo tag contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag
    code
    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
    <?php
     
    function ajouter_lien($html, $mot, $url, $limite=-1, &$count=null)
    {
      // <a\b[^>]+>(%s)</a> tous liens contenant le mot exact (capturé en $1)
      $regex = sprintf('@<a\b[^>]+>(%s)</a>|', $mot);
      // <a\b[^>]+>.*?</a> tout autre lien pouvant contenir le mot (skip)
      $regex.= '<a\b[^>]+>.*?</a>|';
      // </?\w+[^>]+> tout attribut pouvant contenir le mot (skip)
      $regex.= '</?\w+[^>]+>|';
      // \b(%s)\b toutes les occurrences du mot dans le contenu (capturé en $2)
      $regex.= sprintf('\b(%s)\b@si', $mot);
      $options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE;
      preg_match_all($regex, $html, $captures, $options);
     
      // Les remplacements pour substr_replace, sans les skips ou tag <a> existants
      $remplacements = array();
      foreach ($captures as $index => $capture) {
        // si $capture[2] n'est pas vide, alors c'est le mot exact dans le contenu
        if (!empty($capture[2])) {
          $remplacements[] = array(
                               'mot' => $capture[2][0], // le mot
                               'offset' => $capture[2][1], // l'offset
                               'longueur' => strlen($capture[2][0]), // longueur
                             );
        }
        // si $capture[1] n'est pas vide, alors c'est un lien contenant le mot exact
        else if (!empty($capture[1]))  {
          $remplacements[] = array(
                               'mot' => $capture[1][0], // le mot sans tags
                               'offset' => $capture[0][1], // l'offset avec le tag
                               'longueur' => strlen($capture[0][0]), // avec le tag
                             );
        }
        // sinon, aucun transfert car c'était un skip.
      }
     
      // considérer la limite maximale de remplacements, -1 pour tous
      if ($limite > -1) $remplacements = array_slice($remplacements, 0, $limite);
      $count = count($remplacements); // retourner le nombre de remplacements fait
     
      // faire les remplacements selon le contenu de $remplacements
      // array_reverse permet de conserver les offsets valides pour subst_replace
      foreach (array_reverse($remplacements) as $remplacement) {
        $remplacer = sprintf('<a href="%s">%s</a>',
                              $url,
                              $remplacement['mot']);
        $html = substr_replace($html,
                               $remplacer,
                               $remplacement['offset'],
                               $remplacement['longueur']);
      }
     
      // retourer le HTML altéré
      return $html;
    }
     
    $test = 'contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag contenu photo tag contenu photo tag contenu photo <a href="client">tag</a> contenu photo tag contenu photo tag';
     
    echo ajouter_lien($test, 'tag', 'tag.php', 3);
     
    ?>

  13. #53
    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
    Oui, c'est exactement ça pour les liens :o

  14. #54
    Invité
    Invité(e)
    Par défaut
    test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ajouter_tags($test, 'tag', array('strong','em'), 4);
    avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu photo tag contenu photo <strong>tag</strong> contenu <strong>photo tag contenu</strong> photo <em><strong>tag</strong></em> contenu photo tag contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag
    après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu photo <strong>tag</strong> contenu photo <em>tag</em> contenu <strong>photo tag contenu</strong> photo <strong>tag</strong> contenu photo <em>tag</em> contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag
    code
    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
    <?php
     
    function ajouter_tags($html, $mot, $balises, $limite=-1, &$count=null)
    {
      // extraction
      $tags = implode('|', $balises);
      // (?:<(?:%1$s)>)+(%2$s)(?:</(?:%1$s)>)+ toutes imbrications de tags (en $1)
      $regex = sprintf('@(?:<(?:%1$s)>)+(%2$s)(?:</(?:%1$s)>)+|', $tags, $mot);
      // <(%1$s)>.*?%2$s.*?</\2> tout autres tags contenant le mot (skip)
      $regex.= sprintf('<(%s)>.*?%s.*?</\2>|', $tags, $mot);
      // </?\w+[^>]+> tout attribut pouvant contenir le mot (skip)
      $regex.= '</?\w+[^>]+>|';
      // \b(%s)\b toutes les occurrences du mot dans le contenu (capturé en $3)
      $regex.= sprintf('\b(%s)\b@si', $mot);
      $options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE;
      preg_match_all($regex, $html, $captures, $options);
     
      // Les remplacements pour substr_replace, sans les skips ou tag <a> existants
      $remplacements = array();
      foreach ($captures as $index => $capture) {
        // si $capture[3] n'est pas vide, alors c'est le mot exact dans le contenu
        if (!empty($capture[3])) {
          $remplacements[] = array(
                               'mot' => $capture[3][0], // le mot
                               'offset' => $capture[3][1], // l'offset
                               'longueur' => strlen($capture[3][0]), // longueur
                             );
        }
        // si $capture[2] est vide et que $capture[1] n'est pas vide
        // alors c'est un tag ou imbrication de tags contenant le mot exact
        else if (empty($capture[2]) && !empty($capture[1]))  {
          $remplacements[] = array(
                               'mot' => $capture[1][0], // le mot sans tags
                               'offset' => $capture[0][1], // l'offset avec tags
                               'longueur' => strlen($capture[0][0]), // avec tags
                             );
        }
        // sinon, aucun transfert car c'était un skip.
      }
     
      // considérer la limite maximale de remplacements, -1 pour tous
      if ($limite > -1) $remplacements = array_slice($remplacements, 0, $limite);
      $count = count($remplacements); // retourner le nombre de remplacements fait
     
      // faire les remplacements en alternance selon le contenu de $remplacements
      // array_reverse permet de conserver les offsets valides pour subst_replace
      $i = count($remplacements); // nombre de remplacements à faire
      $n = count($balises); // nombre de balises à alterner
      foreach (array_reverse($remplacements) as $remplacement) {
        $i--;
        $remplacer = sprintf('<%1$s>%2$s</%1$s>',
                             $balises[$i % $n],
                             $remplacement['mot']);
        $html = substr_replace($html,
                               $remplacer,
                               $remplacement['offset'],
                               $remplacement['longueur']);
      }
     
      // retour
      return $html;
    }
     
    $test = 'contenu photo tag contenu photo <strong>tag</strong> contenu <strong>photo tag contenu</strong> photo <em><strong>tag</strong></em> contenu photo tag contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag';
     
    echo ajouter_tags($test, 'tag', array('strong','em'), 4);
     
    ?>
    Bonne chance.

  15. #55
    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
    Hum merci encore, deux questions.

    J'ai deux fonctions à la base, l'une qui alterne et l'autre qui n'alterne pas.
    Je dois changer quoi dans ta fonction pour que ça les ajoute les deux ?

    Et après si j'ai <strong><em>mot</em></strong>, je peux m'en sortir comment si je veux remplacer ces 2 balises par une h1 par exemple ?

  16. #56
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    deux questions.
    Tu es comme des sables mouvants

    Citation Envoyé par nono662 Voir le message
    J'ai deux fonctions à la base, l'une qui alterne et l'autre qui n'alterne pas.
    Je dois changer quoi dans ta fonction pour que ça les ajoute les deux ?
    Passer un array d'un seul élément dans le paramètre $balises, genre array('strong'), et l'alternance sera avec elle même.

    Citation Envoyé par nono662 Voir le message
    Et après si j'ai <strong><em>mot</em></strong>, je peux m'en sortir comment si je veux remplacer ces 2 balises par une h1 par exemple ?
    Ajouter un paramètre pour inclure des tags sans qu'ils soient dans l'alternance ?

    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
    <?php
     
    function ajouter_tags($html, $mot, $balises, $limite=-1, $inclues=array(), &$count=null)
    {
      // extraction
      $tags = implode('|', array_merge($balises, $inclues));
      // (?:<(?:%1$s)>)+(%2$s)(?:</(?:%1$s)>)+ toutes imbrications de tags (en $1)
      $regex = sprintf('@(?:<(?:%1$s)>)+(%2$s)(?:</(?:%1$s)>)+|', $tags, $mot);
      // <(%1$s)>.*?%2$s.*?</\2> tout autres tags contenant le mot (skip)
      $regex.= sprintf('<(a|%s)\b[^>]*>.*?%s.*?</\2>|', $tags, $mot);
      // </?\w+[^>]+> tout attribut pouvant contenir le mot (skip)
      $regex.= '</?\w+[^>]+>|';
      // \b(%s)\b toutes les occurrences du mot dans le contenu (capturé en $3)
      $regex.= sprintf('\b(%s)\b@si', $mot);
      $options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE;
      preg_match_all($regex, $html, $captures, $options);
     
      // Les remplacements pour substr_replace, sans les skips ou tags existants
      // exclurent ausssi les liens <a></a>.
      $remplacements = array();
      foreach ($captures as $index => $capture) {
        // si $capture[3] n'est pas vide, alors c'est le mot exact dans le contenu
        if (!empty($capture[3])) {
          $remplacements[] = array(
                               'mot' => $capture[3][0], // le mot
                               'offset' => $capture[3][1], // l'offset
                               'longueur' => strlen($capture[3][0]), // longueur
                             );
        }
        // si $capture[2] est vide et que $capture[1] n'est pas vide
        // alors c'est un tag ou imbrication de tags contenant le mot exact
        else if (empty($capture[2]) && !empty($capture[1]))  {
          $remplacements[] = array(
                               'mot' => $capture[1][0], // le mot sans tags
                               'offset' => $capture[0][1], // l'offset avec tags
                               'longueur' => strlen($capture[0][0]), // avec tags
                             );
        }
        // sinon, aucun transfert car c'était un skip.
      }
     
      // considérer la limite maximale de remplacements, -1 pour tous
      if ($limite > -1) $remplacements = array_slice($remplacements, 0, $limite);
      $count = count($remplacements); // retourner le nombre de remplacements fait
     
      // faire les remplacements en alternance selon le contenu de $remplacements
      // array_reverse permet de conserver les offsets valides pour subst_replace
      $i = count($remplacements); // nombre de remplacements à faire
      $n = count($balises); // nombre de balises à alterner
      foreach (array_reverse($remplacements) as $remplacement) {
        $i--;
        $remplacer = sprintf('<%1$s>%2$s</%1$s>',
                             $balises[$i % $n],
                             $remplacement['mot']);
        $html = substr_replace($html,
                               $remplacer,
                               $remplacement['offset'],
                               $remplacement['longueur']);
      }
     
      // retour
      return $html;
    }
     
    $test = 'contenu photo <a href="#">tag</a> contenu photo <strong>tag</strong> contenu <strong>photo tag contenu</strong> photo <em><strong>tag</strong></em> contenu photo tag contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag';
    echo ajouter_tags($test, 'tag', array('h3'), 4, array('strong', 'em'));
     
    ?>
    avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu photo <a href="#">tag</a> contenu photo <strong>tag</strong> contenu <strong>photo tag contenu</strong> photo <em><strong>tag</strong></em> contenu photo tag contenu photo tag contenu photo <strong>tag</strong> contenu photo tag contenu photo tag
    après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu photo <a href="#">tag</a> contenu photo <h3>tag</h3> contenu <strong>photo tag contenu</strong> photo <h3>tag</h3> contenu photo <h3>tag</h3> contenu photo <h3>tag</h3> contenu photo <strong>tag</strong> contenu photo tag contenu photo tag
    Mon inconscient avait une forte réticence avec h1, d'où h3

    Finalement, mon intuition féminine pour une classe était la bonne Mais je ferai pas.

    Bonne chance.

  17. #57
    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
    Désolé de te solliciter autant

    Chuis vraiment pas doué

    Bon, je teste ça et jte dis quoi :o

  18. #58
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Désolé de te solliciter autant

    Chuis vraiment pas doué
    J'étais taquine, c'était donc en toute amitié.

    Tu auras peut-être appris que la phase d'analyse du besoin est la plus importante. On a passé plus de 3 pages juste pour ça... coder est simple et facile après.

  19. #59
    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 m'embrouille un peu là, si j'utilise ta dernière fonction, ce que tu me dis avant pour mettre deux balises sur un mot ne marchera plus car si j'appelle la fonction deux fois, il me mettra que la seconde ou j'ai raté quelque chose ?

  20. #60
    Invité
    Invité(e)
    Par défaut
    Tu as un exemple ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 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, 12h10
  2. Compter le nombre avec split au autre fonction
    Par ghir_ana dans le forum Langage
    Réponses: 1
    Dernier message: 27/07/2011, 19h28
  3. Explode Split strings
    Par Montor dans le forum Contribuez
    Réponses: 0
    Dernier message: 03/12/2009, 11h36
  4. fonction explode/split ?
    Par Seb33300 dans le forum C++
    Réponses: 12
    Dernier message: 18/04/2007, 12h28
  5. Réponses: 2
    Dernier message: 12/07/2006, 17h19

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