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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    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 émérite
    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
    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 averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    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 averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    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 averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    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 averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 63
    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>

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

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