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. #21
    Invité
    Invité(e)
    Par défaut
    Un appel de méthode et un appel de fonction ne se font pas de la même manière.

    Il faut garder mon_remplacement en dehors d'une classe ou bien remplacer la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return preg_replace_callback($regex, __FUNCTION__, $html);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return preg_replace_callback($regex, array($this, 'mon_remplacement'), $html);
    Sinon, il faut montrer ton code car $NO->mon_remplacement implique un objet.

  2. #22
    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
    Un appel de méthode et un appel de fonction ne se font pas de la même manière.

    Il faut garder mon_remplacement en dehors d'une classe ou bien remplacer la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return preg_replace_callback($regex, __FUNCTION__, $html);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return preg_replace_callback($regex, array($this, 'mon_remplacement'), $html);
    Sinon, il faut montrer ton code car $NO->mon_remplacement implique un objet.

    Donc j'ai :

    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
    $n=$NO->replace($key,$balise[$t],$i,$url,$text,$occurence,$i,$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<$i;$v++){					
     
    						if($v==$j){
    						echo $text[$v];
    						echo $key[$v];
    						echo $balise;
    							 $text[$v]=$NO->mon_remplacement($text[$v],''.$key[$v].'',''.$balise.'');
    							//echo $text[$v];
     
    }
    }
    }
    return $text;
     
    }

    Voilà, merci vachement, tu m'as pratiquement sauvé la vie là.

  3. #23
    Invité
    Invité(e)
    Par défaut
    Nous sommes dans le cas du "sinon"?

    Le changement suggérer à mon_remplacement() pour transformer la fonction en méthode n'a pas fonctionné?

    Je ne vois pas comment est déclarer mon_remplacement() dans de la classe SiteNO. Si tu ne veux pas rendre le code de cette classe public, peut-être me l'envoyer en PM?

    Désolée, j'ai que des questions pour toi

  4. #24
    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
    Nous sommes dans le cas du "sinon"?

    Le changement suggérer à mon_remplacement() pour transformer la fonction en méthode n'a pas fonctionné?

    Je ne vois pas comment est déclarer mon_remplacement() dans de la classe SiteNO. Si tu ne veux pas rendre le code de cette classe public, peut-être me l'envoyer en PM?

    Désolée, j'ai que des questions pour toi
    Ce n'est pas grave, tu m'aides vachement, c'est vraiment sympa de ta part.

    Sinon ta fonction es incluse comme cela :
    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
     
     
    <?php
     
     
    class SiteNO{
     
    	public function __construct(){
     
    		}
     
    	public function doAction($action){
    		switch($action){
    			case 'Site':
    			$this->doActionSiteNO();
    			break;
    			case 'optimiser' :
    			$this->doActionOptimiser();
    			break;
    			case 'optimiserpage' :
    			$this->doActionOptimiserPage();
    			break;
    			default:
    			$this->doActionSiteNO();
    			break;
    		}
    	}
     
     
     
     
     
     
    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;
    }
     
     
     
    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<$i;$v++){					
     
    						if($v==$j){
    					// On est là quand le mot clé est bien celui du texte.
    							 $text[$v]=$NO->mon_remplacement($text[$v],''.$key[$v].'',''.$balise.'');
    echo $text[$v];
     
    }
     
     
    ....
     
    return $text;
     
     
    }

    En espérant que ça t'aide à comprendre.


    et le message d'erreur :


    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

  5. #25
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Sinon ta fonction es incluse comme cela :
    Elle est incluse en tant que méthode alors qu'elle est toujours sous forme d'appel de fonction.

    Tu n'as qu'à copier/coller le code suivant par dessus celle que tu as dans ton 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
    public 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\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])) return $html[0]; // ne rien faire
        return sprintf('<%1$s>%2$s</%1$s>', $tag, $html[1]); // ajouter
      }
      return $html;
    }
    Note: elle est horrible en tant que méthode.

  6. #26
    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 peux faire quelque chose d'autre pour modifier ça ?

  7. #27
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Tisha Carpenter Voir le message
    Tu n'as qu'à copier/coller le code suivant par dessus celle que tu as dans ton code.
    Citation Envoyé par nono662 Voir le message
    Je peux faire quelque chose d'autre pour modifier ça ?
    Mon français est aussi mauvais que ça?

  8. #28
    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
    Mon français est aussi mauvais que ça?
    Désolé, j'avais mal compris ta dernière phrase, désolé


    Je teste ça et je te dis quoi.

    Merci du temps que tu as passé à m'aider.

  9. #29
    Invité
    Invité(e)
    Par défaut
    Y'a pas de mal

    à la prochaine

  10. #30
    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 énormément, ça marche comme je le voulais

    Sinon, je me demandais comment fusionner ta première fonction ( en première page) qui permet d'alterner les balises à celle-ci ?

    Et utiliser ta seconde fonction pour modifier un lien si il a changé.

    Fin, tu as déjà donné beaucoup de ton temps, j'ai l'impression d'abuser là :/

    Mais encore un grand merci.

    Je me suis tiré les cheveux pendant des heures sur cette fonction sans rien comprendre à preg_replace_callback.

  11. #31
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Je me suis tiré les cheveux pendant des heures sur cette fonction sans rien comprendre à preg_replace_callback.
    Alors il faut revenir à preg_match_all avec une boucle, le temps de traitement sera le même et le code plus facile à maintenir pour toi.

    J'avais oublié cette alternance Je ne suis pas certaine de comprendre tes règles d'alternance. Sur la chaine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1ere voiture, 2e <strong>voiture</strong>, 3e <em>voiture</em> et 4e voiture.
    Quel seront les chaines résultantes voulues dans le cas où l'ordre demandé est <strong><em> et dans le cas où l'ordre est <em><strong> sur le mot voiture?

    Finalement, j'ai l'impression que nous ferons la distance New York/Albany en passant par Paris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <pre>
    <?php
     
    $html = '1ere voiture, 2e <strong>voiture</strong>, 3e <em>voiture</em> et 4e voiture.';
     
    $regex = '@<((strong)|(em))\b[^>]*>.*?\bvoiture\b.*?</\1>|\bvoiture\b@si';
    $options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE;
    preg_match_all($regex, $html, $captures, $options);
    print_r($captures);
     
    ?>
    </pre>
    Il suffira d'un code PHP assez simple après ça si tes règles ne sont pas trop compliquées.

  12. #32
    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
    Pour être clair :

    Il y a une checkbox de balises qui peut être agrandie.
    Donc si la personne choisit 3 balises, il faut alterner : 1-2-3-1-2-3. Ca se limite à ça.


    Et pour les <a href ...title= ...>voiture</a> tu as une idée pour pas que je me retrouve avec un mot clé qui se retrouve en lien 100 fois ?

  13. #33
    Invité
    Invité(e)
    Par défaut
    C'est ce que je comprends.

    Bonne chance pour la suite.

    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
    <?php
     
    function mon_remplacement($html, $mot, $balises)
    {
      // 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]);
      }
     
      // ajouter les balises en alternances
      $i = count($captures); // nombre de remplacement à faire
      $count = count($balises); // nombre de balises à alterner
      foreach (array_reverse($captures) as $capture) {
        $i--;
        $debut = $capture[0][1];
        $mot = $capture[0][0];
        $longueur = strlen($mot);
        $remplacer = sprintf('<%1$s>%2$s</%1$s>', $balises[$i % $count], $mot);
        $html = substr_replace($html, $remplacer, $debut, $longueur);
      }
     
      // retour
      return $html;
    }
     
    $html = '<img title="voiture"/> 1ere Voiture, 2e <strong>voiture</strong>, 3e <em>voiture</em>, 4e voiturE et une dernière <a href="#">voiture</a>.';
    echo mon_remplacement($html, 'voiture', array('strong', 'em'));
     
    ?>

  14. #34
    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
    Encore deux question, au lieu de d'ignorer les mots avec balise autour dans ta dernière fonction, c'est possible de les enlever et remettre des balises autour ?

    Sinon, tu as une idée pour faire pareil avec des liens ?
    C'est-à-dire de modifier un lien autour d'un mot clé ou mettre un lien ?
    Car avec ma fonction, il ajoute de plus en plus de liens.


    Dernière question, c'est possible de limiter le nombre d'occurences avec ta dernière fonction ?
    COmme un limit dans la fonction preg_replace ?

    Merci encore une fois ù_ù

  15. #35
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Encore deux question, au lieu de d'ignorer les mots avec balise autour dans ta dernière fonction, c'est possible de les enlever et remettre des balises autour ?
    Il y a un risque de changer les tags de mise en page, comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <strong class="vitale">la voiture familiale</strong>
    en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    la <strong>voiture</strong> familiale
    Tu es à l'aise avec ça ? Ou il y a des contraintes que tu n'as pas encore clairement exprimés?

    Citation Envoyé par nono662 Voir le message
    Sinon, tu as une idée pour faire pareil avec des liens ?
    C'est-à-dire de modifier un lien autour d'un mot clé ou mettre un lien ?
    Car avec ma fonction, il ajoute de plus en plus de liens.
    Fait voire ton code si tu veux des commentaires.

    Par contre tu es sur un terrain glissant, le tag <a> est indispensable pour la navigation des visiteurs. Il y a un risque de transformer un lien nécessaire en lien SEO sans intérêt pour le visiteur (réf.: ta première question)

    Citation Envoyé par nono662 Voir le message
    Dernière question, c'est possible de limiter le nombre d'occurences avec ta dernière fonction ?
    COmme un limit dans la fonction preg_replace ?
    Je ne vois pas d'ennuis techniques particuliers coté programmation. Mais je vois tous plein d'ennuis pour tes visiteurs pour #1 et #2.

    Question stupide: le peu de code que tu as montré semble indiquer que tu procède en batch. Mais j'aimerais savoir si tu sauvegarde les modifications par dessus les originaux ?

  16. #36
    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
    Pour les liens vu qu'à la base, ils ne sont pas autour du mot lors de la première optimisation.

    Pour les liens, je faisun simple preg_replace donc logique qu'il m'en ajoute de plus en plus mais vu que je suis vraiment pas doué avec les expressions régulières, je ne sais pas comment faire.

    Pour les liens, faudrait vraiment que je puisse les mettre à jour lors des optimisations suivantes.

    Dans ma BDD, ya une URL associée à un mot donc si on change l'url associée à ce mo, faudrait que lors de la mise à jour succédant à cette modif, elle change le lien.


    Pour mettre à jour tout ça :

    Je récupère dans la BDD du client, j'optimise et je remets tout ça dans la BDD du client avec un update.

  17. #37
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Pour les liens vu qu'à la base, ils ne sont pas autour du mot lors de la première optimisation.
    ...
    Je récupère dans la BDD du client, j'optimise et je remets tout ça dans la BDD du client avec un update.
    Il y a un champs pour conserver l'original? Sinon, est-il possible d'ajouter un champs "original" dans la base de donnée du client? Et repartir de ce champs "original" pour faire les modifications selon la dernière mode SEO?

    Procéder par batch est parfait. Mais s'il y a absence d'un champs pour conserver l'original, il y a un défaut dans la conception.

    Citation Envoyé par nono662 Voir le message
    Pour les liens, je faisun simple preg_replace donc logique qu'il m'en ajoute de plus en plus mais vu que je suis vraiment pas doué avec les expressions régulières, je ne sais pas comment faire.

    Pour les liens, faudrait vraiment que je puisse les mettre à jour lors des optimisations suivantes.

    Dans ma BDD, ya une URL associée à un mot donc si on change l'url associée à ce mo, faudrait que lors de la mise à jour succédant à cette modif, elle change le lien..
    Oui, preg_match_all peut-être utile. Mais sans code il m'est difficile d'être affirmative.

    Si la seule copie a déjà 1 zillion de <a><em><strong> imbriqués, il faudra nettoyer pour essayer de "re-fabriquer" l'original. Et idéalement conserver ce "re-original" dans un champs séparé.

  18. #38
    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
    Malheureusement non, pas de champ original.

    Mais à la base, aucun mot n'est entouré de la balise <a href...></a> donc ça ne devrait pas poser de problème.

    Sinon en ce qui concerne le code, ya juste un preg_replace.

    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
     
     
    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<$i;$v++){					
     
    						if($v==$j){
     
    							 $text[$v]=$NO->mon_remplacement($text[$v],''.$key[$v].'',''.$balise.'');
     
     
    								}
    								else{
    								if($b==0){
     
    									$text[$v]=preg_replace('`'.$key[$j].'`i','<a href ='.$url[$j].'>'.$key[$j].'</a>',$text[$v]);
    // si le mot clé ne correspond pas à l'URL qui lui est associé, on fait un lien
    		}
    	}
    }					
    }
    Déjà, ça marche mal car il me remplace par le mot clé de la BDD ( donc ne respecte pas la casse)

  19. #39
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Malheureusement non, pas de champ original.
    Et il n'y a pas possibilité d'ajouter ce champs?

    Citation Envoyé par nono662 Voir le message
    Mais à la base, aucun mot n'est entouré de la balise <a href...></a> donc ça ne devrait pas poser de problème.
    Et à 2e, 3e, ...., Nième modification ils seront là. Si tu ne peux pas ajouter un champs, tu devras penser à ajouter un marqueur dans le HTML pour facilement supprimer ces tags SEO.

    Citation Envoyé par nono662 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text[$v]=preg_replace('`'.$key[$j].'`i','<a href ='.$url[$j].'>'.$key[$j].'</a>',$text[$v]);
    Déjà, ça marche mal car il me remplace par le mot clé de la BDD ( donc ne respecte pas la casse)
    Par défaut il y capture en $0 de toute la sous-chaine qui a satisfait la regex entière, tu peux l'utiliser dans le remplacement (si $0 est pertinent) comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text[$v]=preg_replace('`'.$key[$j].'`i','<a href ='.$url[$j].'>$0</a>',$text[$v]);
    Mais ça fera tout de même des remplacements dans les attributs des tags comme dans les contenus des <a>.

    Je t'ai fait un code commenté avec le principe autour de preg_match_all pour te permettre d'être autonome.

    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
    <?php
     
    function ajouter_lien($html, $mot, $url, $limite=-1)
    {
      // 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);
     
      // faire les remplacements selon le contenu restant de $captures
      // array_reverse permet de conserver les offsets valides pour substr_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;
    }
     
    $html = '<img title="voiture"/> <b>voiture</b>, 1ere Voiture, <strong>2e voiture</strong>, 3e <strong><em>voiture</em></strong>, 4e voiturE et une dernière <a href="#">voiture</a>.';
     
    echo ajouter_lien($html, 'voiture', 'http://exemple.com');
    echo PHP_EOL, '<hr/>', PHP_EOL;
    echo ajouter_lien($html, 'voiture', 'http://exemple.com', 2);
     
    ?>
    Tu as des questions sur ce code ?

  20. #40
    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
    Pour le moment, non.

    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 ?


    Citation Envoyé par Tisha Carpenter Voir le message
    C'est ce que je comprends.

    Bonne chance pour la suite.

    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
    <?php
     
    function mon_remplacement($html, $mot, $balises)
    {
      // 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]);
      }
     
      // ajouter les balises en alternances
      $i = count($captures); // nombre de remplacement à faire
      $count = count($balises); // nombre de balises à alterner
      foreach (array_reverse($captures) as $capture) {
        $i--;
        $debut = $capture[0][1];
        $mot = $capture[0][0];
        $longueur = strlen($mot);
        $remplacer = sprintf('<%1$s>%2$s</%1$s>', $balises[$i % $count], $mot);
        $html = substr_replace($html, $remplacer, $debut, $longueur);
      }
     
      // retour
      return $html;
    }
     
    $html = '<img title="voiture"/> 1ere Voiture, 2e <strong>voiture</strong>, 3e <em>voiture</em>, 4e voiturE et une dernière <a href="#">voiture</a>.';
    echo mon_remplacement($html, 'voiture', array('strong', 'em'));
     
    ?>

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 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