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 :

fonction pour transformer la nième occurrence donné dans une chaine ?


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut fonction pour transformer la nième occurrence donné dans une chaine ?
    Bonjour,
    J'ai une question assez simple en PHP
    Je cherche une fonction pour transformer la nième occurrence donné dans une chaine.
    Par exemple je veux remplacer le second "la" par "cette" dans la phrase "La maison sur la colline". Qui doit donner "la maison sur cette colline".

    Je connais str_replace() mais on ne peut pas lui dire de remplacer par exemple juste la seconde occurrence ou encore les deux premiers.

    Merci

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    J'ai pas d'imagination aujourd'hui, donc voici un algo novice:

    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
    <?php
     
    /**
     * Changes all the Nth $search occurences by $replace in $subject.
     * 
     * Returns the new string in case of success, false otherwise.
     * 
     * @param string|string[]   $search    The value to search
     * @param string|string[]   $replace   The replacement value
     * @param string            $subject   The subject (duh)
     * @param integer|integer[] $occurence The occurence(s) at which the replacement shall be done
     * 
     * @return string|false
     */
    function str_replace_occurence ($search, $replace, $subject, $occurence) {
        $occurence = array_flip((array)$occurence);
        $search    = array_values((array)$search);
        $replace   = array_values((array)$replace);
     
        if (empty($subject) || empty($search))
            return $subject;
     
        if (($scount = count($search)) != count($replace))
            return false;
     
        foreach ($search as $offset => $needle) {
            $pos = 0;
            $len = strlen($needle);
            $rep = $replace[$offset];
            $occur = 0;
     
            while (($pos = strpos($subject, $needle, $pos)) !== false && ++$occur) {
                if (isset($occurence[$occur]))
                    ($subject = substr($subject, 0, $pos) . $rep . substr($subject, $pos + $len));
                $pos += $len;
            }
        }
        return $subject;
    }
     
    // USAGE //
     
    $str = "la maison sur la coline est une jolie maison";
     
    // remplacer la deuxième occurence de 'la' par 'cette'
    var_dump( str_replace_occurence('la', 'cette', $str, 2) );
     
    // remplacer la première occurence de 'la' et 'maison' par 'cette' et 'cabane'
    var_dump( str_replace_occurence(array('la','maison'), array('cette','cabane'), $str, 1) );
     
    // remplacer la 3 ème occurence (inexistante) de 'maison' par 'bicoque'
    var_dump( str_replace_occurence('maison', 'bicoque', $str, 3) );
    Le principe est d'itérer sur la chaine d'occurences en occurences et d'incrémenter le compteur $occur à chaque passage. Lors de l'itération N, on regarde dans la table des occurences souhaitées si N est valide et si c'est le cas, on fait un remplacement à grand coups de substr dégeus.

    On emballe tout ça pour permettre à $search et $replace d'être des tableaux et l'affaire est dans le sac.

    Pour ta culture perso, j'ai inversé $occurence afin de pouvoir utiliser le trick des hashtables: isset et 1000x plus rapide que in_array ou array_search

    Au passage, ce besoin est complètement dingo

    -- Edit: avec les commentaires en anglais ça en jette un max !

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Wow je pensais pas qu'on sortirais une fonction toute faite
    Merci infiniment. Je pensais qu'il y'avait un moyen assez simple que j'avais omis, genre une fonction php caché

    Pourquoi ce besoin est dingo ? Je dois traiter et formater un tableau HTML et en gros il me manquait une fonction comme celle ci pour finir le travail. (bon c'est un peu compliqué à expliquer)



    ($subject The subject (duh) )

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

Discussions similaires

  1. fonction pour compter le nombre de personne dans une tranche d'age
    Par djo007 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/02/2012, 00h03
  2. Réponses: 3
    Dernier message: 01/08/2008, 09h58
  3. Réponses: 7
    Dernier message: 03/04/2008, 22h31
  4. Récupérer 2 données dans une chaine
    Par gorgoroth dans le forum Langage
    Réponses: 5
    Dernier message: 27/03/2008, 10h19
  5. Réponses: 3
    Dernier message: 07/02/2006, 13h26

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