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. #61
    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
    <strong>voiture</strong> deviendra <em>voiture</em> avec ta dernière fonction alors que dans ce caslà, j'aurais voulu avoir<strong><em>voiture</strong></em>

    C'est compliqué de prendre en compte toutes ces contraintes :/

  2. #62
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    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 ?
    Citation Envoyé par Tisha Carpenter Voir le message
    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.
    Citation Envoyé par nono662 Voir le message
    <strong>voiture</strong> deviendra <em>voiture</em> avec ta dernière fonction alors que dans ce caslà, j'aurais voulu avoir<strong><em>voiture</strong></em>

    C'est compliqué de prendre en compte toutes ces contraintes :/
    Le cas limite s'applique aussi à tes ajouts. Si tu veux ajouter <strong> sur voiture de même que <strong> et <em> en alternance sur voiture... le seul moyen de contourner le nettoyage est de faire d'abord array('strong', 'em) et ensuite array('strong');

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $test = '1ere voiture, 2e voiture, 3e voiture, 4e voiture et une dernière voiture pour la route';
    $test = ajouter_tags($test, 'voiture', array('strong', 'em'), 4);
    $test = ajouter_tags($test, 'voiture', array('strong'), 4);
    echo $test;
     
    ?>
    Produira ce que tu attends
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1ere <strong>voiture</strong>, 2e <em><strong>voiture</strong></em>, 3e <strong>voiture</strong>, 4e <em><strong>voiture</strong></em> et une dernière voiture pour la route
    Alors que dans l'ordre inverse, les <strong> seront remplacés (détruit/ajouté) comme tu l'as demandé.

  3. #63
    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
    Et si je veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <em><strong>voiture</em></strong>, 2e <em><strong>voiture</strong></em>
    COmment puis je faire ?

    pas d'alternance dans ce cas là donc.

    Car dans tous les cas, jvais en supprimer des balises. :/

  4. #64
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $test = '1ere voiture, 2e voiture, 3e voiture, 4e voiture et une dernière voiture pour la route';
    $test = ajouter_tags($test, 'voiture', array('em'), 4);
    $test = ajouter_tags($test, 'voiture', array('strong'), 4);
    echo $test;
     
    ?>
    Produira:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1ere <em><strong>voiture</strong></em>, 2e <em><strong>voiture</strong></em>, 3e <em><strong>voiture</strong></em>, 4e <em><strong>voiture</strong></em> et une dernière voiture pour la route

  5. #65
    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 pour tout.
    Tout devrait marcher maintenant.

  6. #66
    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
    Et bah non, je fais juste des tests de base et ça marche pas une fois de plus.

    J'ai beau mettre n'importe quelle limite dans la fonction, ça marche pas dans mon application, je pige pas.


    donc j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php 
    $n=$NO->replace($mot,array('strong'),$te,$url,$text,$occurence,$te,$b);
    $n=$NO->replace($mot,array('em'),$te,$url,$n,$occurence,$te,$b);
    ?>
    chaque case du tableau $text contient :
    contenu photo tag contenu photo tag
    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
     <?php
     
    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->ajouter_tags($text[$v],''.$key[$v].'',$balise,4);						
    								}
     
    								else{
     
    									if($key[$j]!=$key[$v]){
    												$text[$v]=$NO->ajouter_lien($text[$v], $key[$j], $url[$j]);
     
     
    									}
     
    								}
     
    						}
    					}
     
     
     
    				return $text;
     
     
    	} 
     
    ?>
    Ca appelle ta fonction.
    Mais j'obtiens ça :
    Pour text[0] et text[1] (mot clé contenu ):
    <strong><em>contenu</em></strong> <a href="
    tag.php">tag</a> <a href="
    photo.php">photo</a> <strong>contenu</strong> <a href="
    tag.php">tag</a> <a href="
    photo.php">photo</a>

    Pour text[2] et text[3] (mot clé photo ):
    <a href="contenu.php">contenu</a> <a href="
    tag.php">tag</a> photo <a href="contenu.php">contenu</a> <a href="
    tag.php">tag</a> <strong><em>photo</em></strong>

    Pour text[4] et text[5] (mot clé tag ) :

    <a href="contenu.php">contenu</a> tag <a href="
    photo.php">photo</a> <a href="contenu.php">contenu</a>

    Ha et ya aussi des retours à la ligne non voulus qui sont bien chiants car mal interprétés dans la BDD :/

    Une idée d'où ça peut venir car à la base ta fonction marche bien ?

    Ce que je pige pas c'est que j'utilise toujours la même fonction et ça me donne des résultats différents, c'est bizarre :/

    Après d'autres texts, ça viendrait de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php 
    if($j==$v){
     $text[$v]=$NO->ajouter_tags($text[$v],''.$key[$v].'',$balise,4);		
     
    ?>
    Le $text[$v] passe mal car si je mets directement la phrase, ça marche :/
    Mais je vois pas quoi changer
    }

  7. #67
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Ca appelle ta fonction.
    Mais j'obtiens ça :
    Pour text[0] et text[1] (mot clé contenu ):
    <strong><em>contenu</em></strong> <a href="
    tag.php">tag</a> <a href="
    photo.php">photo</a> <strong>contenu</strong> <a href="
    tag.php">tag</a> <a href="
    photo.php">photo</a>
    Oui, c'est mon erreur sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regex.= sprintf('<(a|%s)\b[^>]*>.*?%s.*?</\2>|', $tags, $mot);
    Qui doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regex.= sprintf('<(a|%s)\b[^>]*>.*?</\2>|', $tags, $mot);
    test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $text[0] = 'contenu photo tag contenu photo tag';
     
    $text[0] = ajouter_tags($text[0], 'contenu', array('strong'), 4);
    $text[0] = ajouter_lien($text[0], 'tag', 'tag.php');
    $text[0] = ajouter_tags($text[0], 'contenu', array('em'), 4);
    $text[0] = ajouter_lien($text[0], 'photo', 'photo.php');
     
    echo $text[0];
    avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu photo tag contenu photo tag
    après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <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>
    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
    <?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);
      // <(a|%s)\b[^>]*>.*?</\2> tout autres tags pouvant contenir le mot (skip)
      $regex.= sprintf('<(a|%s)\b[^>]*>.*?</\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
      // les skip incluent aussi 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;
    }
     
    ?>

    Citation Envoyé par nono662 Voir le message
    Ha et ya aussi des retours à la ligne non voulus qui sont bien chiants car mal interprétés dans la BDD :/
    Je ne suis pas certaine de comprendre. S'il y a un retour à la ligne au début de l'url dans la base de données comme semble monter ton résultat, alors trim() devrait l'enlever.

    Pour tester si c'est le cas,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php 
    echo '<pre>', print_r($url, true), '</pre>';
    $n=$NO->replace($mot,array('strong'),$te,$url,$text,$occurence,$te,$b);
    $n=$NO->replace($mot,array('em'),$te,$url,$n,$occurence,$te,$b);
    ?>

  8. #68
    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 je fais trim($text[$v])

    Ca ne change rien.

    Pour être plus clair, voici un imprim écran de la BBD :



    Et c'est vraiment embêtant car si je refais une optimisation, ça me supprime toute la BDD client

    Les deux traits verticaux ajoutés après le <a href=", c'est juste pour montrer que c'est là qu'il y a un soucis :o

  9. #69
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Quand je fais trim($text[$v])

    Ca ne change rien.
    Parce qu'il faut faire trim($url[$j]) selon ce que tu décris.

    Que donne le print_r du code ci-dessous ?

    Citation Envoyé par Tisha Carpenter Voir le message
    Pour tester si c'est le cas,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php 
    echo '<pre>', print_r($url, true), '</pre>';
    $n=$NO->replace($mot,array('strong'),$te,$url,$text,$occurence,$te,$b);
    $n=$NO->replace($mot,array('em'),$te,$url,$n,$occurence,$te,$b);
    ?>
    Citation Envoyé par nono662 Voir le message
    Pour être plus clair, voici un imprim écran de la BBD :



    Et c'est vraiment embêtant car si je refais une optimisation, ça me supprime toute la BDD client
    J'ai testé:
    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
     
    $test = '<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>';
     
    $test = ajouter_lien($test, 'photo', 'new_photo.php', 4);
    $test = ajouter_tags($test, 'contenu', array('strong','em'), 4);
    $test = ajouter_lien($test, 'tag', 'new_tag.php', 4);
     
    echo $test;
     
    ?>
    avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <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>
    après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <strong>contenu</strong> <a href="new_photo.php">photo</a> <a href="new_tag.php">tag</a> <em>contenu</em> <a href="new_photo.php">photo</a> <a href="new_tag.php">tag</a>
    Ce qui est le résultat attendu. Quelle re-optimisation as-tu tenté sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <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>
    Je ne vois pas pourquoi un retour à la ligne ferait un UPDATE destructif, mais je ne suis pas une spécialiste SQL. Si je ne suis pas en erreur sur ce fait, alors en toute logique il y a une remise à vide de la variable avant UPDATE.

  10. #70
    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
    Avec le trim sur url($j)ça a l'air de marcher.

    Mais logiquement, le faire sur $text[$v], ça n'aurait pas du marcher ?

    Plus de suppresion de BDD, je vois le bout du tunnel là :o

  11. #71
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nono662 Voir le message
    Avec le trim sur url($j)ça a l'air de marcher.

    Mais logiquement, le faire sur $text[$v], ça n'aurait pas du marcher ?
    Non, tes retours à la ligne sont dans ton champs url selon ce que tu as montré.

  12. #72
    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 mais après ça, $url[$j] se retrouve dans $text[$v], spour ça que ça me semble bizarre.
    Fin, bref, tout marche et tout ça grâce à toi, sans toi, j'y serais encore fin aout.

+ Répondre à la discussion
Cette discussion est résolue.
Page 4 sur 4 PremièrePremière 1234

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