PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 25-06-2009 15:56:39

JulioBox
Membre
Inscription : 25-06-2009
Messages : 20

[Résolu] Str_Replace et nombre de passage

Bonjour à tous !
Je n'ai pas trouvé le moyen de ne pas tout remplacer avec str_replace hmm

Exemple :

$str = 'bonjour à toi, bonjour à lui et bonjour à vous';
$str2 = str_replace('bonjour', 'salut', $str);
echo $str2;

=> 'salut à toi, salut à lui et salut à vous'
je souhaite le résultat :
=> 'salut à toi, salut à lui et bonjour à vous'
c'est à dire limiter à X passage maximum (ici 2)

Existe-il une autre fonction que je n'ai pas vue ?

Merci d'avance

Dernière modification par JulioBox (25-06-2009 16:16:00)

Hors ligne

#2 25-06-2009 16:00:49

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [Résolu] Str_Replace et nombre de passage

Si tu avais seulement fait l'effort de lire la doc, [http://fr2.php.net/manual/fr/function.str-replace.php]tu y aurais lu qu'il existe un quatrième argument optionnel à la fonction

$str = 'bonjour à toi, bonjour à lui et bonjour à vous';
$str2 = str_replace('bonjour', 'salut', $str,2);
echo $str2;

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 25-06-2009 16:15:23

JulioBox
Membre
Inscription : 25-06-2009
Messages : 20

Re : [Résolu] Str_Replace et nombre de passage

Si tu avais seulement fait l'effort de comprendre la doc tu aurais compris l'utilité de ce quatrième argument optionnel à la fonction :

Exemple :

// Utilisation du compteur d'occurrences en PHP 5.0.0
$str = str_replace("ll", "", "good golly miss molly!", $count);
echo $count; // 2

Déjà ton $str2 = str_replace('bonjour', 'salut', $str,2); planterais car "2" n'est pas une variable.
Et ce $count sera renseigné par la fonction, il contiendra le nombre de fois que "ll" aura été remplacé, en aucun cas il limitera le nombre de remplacement à ce chiffre.

Merci de ne pas prendre les gens de haut quand on se plante :]

Dernière modification par JulioBox (25-06-2009 16:15:43)

Hors ligne

#4 25-06-2009 18:31:53

mcAllan
Mowdérateur
Lieu : Châteaurenard en Provence
Inscription : 08-05-2009
Messages : 269

Re : [Résolu] Str_Replace et nombre de passage

Allons, allons,

La traduction en français comporte une note pas très bien traduite :

COUNT : Note:  If passed, this will hold the number of matched and replaced needles.

traduit par :

COUNT : Note:  Si fourni, contiendra le nombre de recherches et d'occurrences à remplacer.

Et en effet, $count contiendra le nombre d'occurrences remplacées et doit être une variable (car passée par référence).


Promotion de PPOO : Programmation Propre Orientée Objet !!
Recommande AAO : Apéritif Avec Olives...
Glop, glop

Hors ligne

#5 25-06-2009 23:35:05

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [Résolu] Str_Replace et nombre de passage

mcAllan a écrit :

Allons, allons,

La traduction en français comporte une note pas très bien traduite :

COUNT : Note:  If passed, this will hold the number of matched and replaced needles.

traduit par :

COUNT : Note:  Si fourni, contiendra le nombre de recherches et d'occurrences à remplacer.

Et en effet, $count contiendra le nombre d'occurrences remplacées et doit être une variable (car passée par référence).

Au temps pour moi pour le passage par référence, ça m'apprendra à toujours tester avant de recommander une syntaxe.
Pour la fonctionnalité, la documentation en français, même revue par mcAllan, demeure ambigüe.
La traduction fidèle serait

contiendra le nombre d'occurrences concordantes et remplacées

Pour en revenir à ton problème de limitation des remplacements il faudrait regarder, me semble-t'il du côté des expressions rationnelles.
Pour me faire pardonner mon intempestivité, un petit cadeau tout de même:

<?php
function remplace_n($modele,$subst,$chaine,$n){
    $saut=strlen($modele);
    while($n>0 && strpos($chaine,$modele)!==false){
        $tag=strpos($chaine,$modele);
        $debut=substr($chaine,0,$tag).$subst;
        $fin=substr($chaine,$tag+$saut);
        $chaine=$debut.$fin;
        $n--;
        }
    return $chaine;
    }
$string='salut, salut, et re-salut';
echo remplace_n('salut','bonjour',$string,2);

Pardonné ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 26-06-2009 09:41:54

JulioBox
Membre
Inscription : 25-06-2009
Messages : 20

Re : [Résolu] Str_Replace et nombre de passage

Hello

Merci à vous 2, oui pardonné pas grave ^^

Ca marche bien mais contrairement à str_replace je ne peux utiliser un array en entrée hmm

Exemple de la doc :

// Génère : You should eat pizza, beer, and ice cream every day
$phrase  = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy   = array("pizza", "beer", "ice cream");
$newphrase = str_replace($healthy, $yummy, $phrase);

Avec remplace_n ça ne fonctionne pas : comment modifier ta fonction ?

Merci à vous

Hors ligne

#7 26-06-2009 09:49:14

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [Résolu] Str_Replace et nombre de passage

Dans l'exemple que tu donnes la limitation des remplacements n'a plus vraiment de sens donc, pourquoi vouloir réinventer la roue ?
Continue d'utiliser str_replace()


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#8 26-06-2009 10:01:27

JulioBox
Membre
Inscription : 25-06-2009
Messages : 20

Re : [Résolu] Str_Replace et nombre de passage

Oui l'exemple de la doc ne correspond pas avec mon besoin, c'était pour montrer que les ARRAY sont possibles.

Ce que je souhaite est donc :

      $phrase  = "bonjour bonjour bonjour";
      $str1= array("bonjour", "truc", "10");
      $str2= array("salut", "machin", "99");
      $newphrase = str_remplace_n($str1, $str2, $phrase, 2); // 2 passages maxi
      echo $newphrase; // salut salut bonjour

Suis-je clair ? merci encore

Hors ligne

#9 26-06-2009 10:27:56

JulioBox
Membre
Inscription : 25-06-2009
Messages : 20

Re : [Résolu] Str_Replace et nombre de passage

Et il te servirait à quoi le "99" de $str2 ?

On s'en fiche c'est un exemple hmm

Dernière modification par JulioBox (26-06-2009 10:28:32)

Hors ligne

#10 26-06-2009 10:30:49

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [Résolu] Str_Replace et nombre de passage

Comment, du coup, faudrait-il interpréter le 2 sur cette phrase ?

$phrase="10 bonjour truc truc bonjour truc truc bonjour"

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#11 26-06-2009 10:34:41

JulioBox
Membre
Inscription : 25-06-2009
Messages : 20

Re : [Résolu] Str_Replace et nombre de passage

Le résultat devrait être :

"99 salut machin machin salut truc truc bonjour"

Sur chaque mot, 2 passages maxi.

Merci de ton aide, je cafouille dessus ^^

Hors ligne

#12 26-06-2009 10:44:37

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [Résolu] Str_Replace et nombre de passage

Ce qui rend l'adaptation un peu délicate c'est le fait que les arguments passés à la fonction puissent être des array ou des scalaires, et que si l'un est un scalaire et que l'autre est un array ou si les deux arrays n'ont pas le même nombre d'items, il faut voir si c'est exploitable ou pas et, dans la négative retourner un message d'erreur explicite.
Bref, on ne peut plus faire ça sur un coin de table. Il faut se poser et bien penser l'algorithme. Et là, je n'ai pas le temps.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#13 26-06-2009 11:08:57

JulioBox
Membre
Inscription : 25-06-2009
Messages : 20

Re : [Résolu] Str_Replace et nombre de passage

Pas de problème, pour le moment je garde str_replace et si jamais j'y parviens, je la poste ici.
Merci à vous !

Hors ligne

#14 26-06-2009 11:41:54

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [Résolu] Str_Replace et nombre de passage

La solution passait, comme souvent dans ce cas par un petit peu de ré-entrance du code:

<?php
function str_remplace_n($modele,$subst,$chaine,$n){
    if((is_array($modele) && !is_array($subst))|| (!is_array($modele) && is_array($subst))){
        die('les deux premier arguments ne sont pas tous deux des arrays.');
        }
    elseif(!is_array($modele) && !is_array($subst)){
        $saut=strlen($modele);
        while($n>0 && strpos($chaine,$modele)!==false){
            $tag=strpos($chaine,$modele);
            $debut=substr($chaine,0,$tag).$subst;
            $fin=substr($chaine,$tag+$saut);
            $chaine=$debut.$fin;
            $n--;
            }
        return $chaine;
        }
    elseif(count($modele)<>count($subst)){
        die('les deux premiers arguments arrays ne comportent pas le même nombre d\'éléments');
        }
    else{
        $nbitems=count($modele);
        $mixed=array();
        for($i=0;$i<$nbitems;$i++){
            $modele[$i].=' ';
            $mixed[$modele[$i]]=$subst[$i].'';
            }
        foreach($mixed as $cle=>$val){
            $chaine=str_remplace_n(trim($cle),$val,$chaine,$n);
            }
        return $chaine;
        }
    }
$phrase="10 bonjour truc truc bonjour truc truc bonjour";
$str1= array("bonjour", "truc", "10");
$str2= array("salut", "machin", "99");
$newphrase = str_remplace_n($str1, $str2, $phrase, 2); // 2 passages maxi
echo $newphrase; //99 salut machin machin salut truc truc bonjour

à tester, toutefois, encore et encore.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#15 26-06-2009 13:27:25

JulioBox
Membre
Inscription : 25-06-2009
Messages : 20

Re : [Résolu] Str_Replace et nombre de passage

...ou encore mieux chercher dans la doc mon cher Julio ><

$str = '10 bonjour truc truc bonjour truc truc bonjour';
$str1= array('/bonjour/', '/truc/', '/10/');
$str2= array('salut', 'machin', '99');
$newphrase = preg_replace($str1, $str2, $str, 2);
echo $newphrase; // "99 salut machin machin salut truc truc bonjour"

Ce résultat est celui que je cherchais !
Merci pour tes efforts tout de même !

ps : comment fait-on passer le post en "[Résolu]" ?

Dernière modification par JulioBox (26-06-2009 13:28:21)

Hors ligne

#16 26-06-2009 13:38:43

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [Résolu] Str_Replace et nombre de passage

JulioBox a écrit :

...ou encore mieux chercher dans la doc mon cher Julio ><

C'est ce que je te disais ce matin

Pour en revenir à ton problème de limitation des remplacements il faudrait regarder, me semble-t'il du côté des expressions rationnelles.

A vérifier si str_remplace_n() ne se montre pas plus rapide que preg_replace(), les fonctions  à base d'expressions rationnelles (avec lesquelles on me sait pas en osmose) étant réputées gourmandes en ressources.
Bref, l'important est qu'on ait contribué à faire avancer le schmilblick.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#17 26-06-2009 13:51:19

JulioBox
Membre
Inscription : 25-06-2009
Messages : 20

Re : [Résolu] Str_Replace et nombre de passage

Merci bien !

Hors ligne

Pied de page des forums