Remplacer des blocs {masculin/feminin} par masculin ou feminin [Résolu]

Signaler
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
-
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
-
Bonjour,

j'ai une chaîne de caractère genre "Bonjour {Monsieur/Madame}, ..."

je voudrais pouvoir, selon le sexe que je passe en paramètre, remplacer le bloc {Monsieur/Madame} soit par Monsieur soit par Madame. il peut y avoir plusieurs blocs de ce type avec des mots différents de chaque côté du "/" bien sûr.

j'ai fait un truc de ce genre

$title_array = str_split($this->title);
$title = '';
$male = '';
$female = '';
$sex_indicator = '';
foreach($title_array as $i){
switch($i){
case '{':
$sex_indicator = 'm';
break;
case '/':
if($sex){
$title.=$male;
}
$sex_indicator = 'f';
break;
case '}':
if(!$sex){
$title.=$female;
}
$sex_indicator = '';
$male = '';
$female = '';
break;
default:
switch($sex_indicator){
case 'm':
$male.=$i;
break;
case 'f':
$female.=$i;
break;
default:
$title.=$i;
break;
}
break;
} 
}


alors c'est sûr, sa marche, mais qu'est-ce que c'est crade ! vous auriez pas une petite solution qui fasse pas 20 lignes ?


Espérer le meilleur
Prévoir le pire

7 réponses

Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
Ah, j'avais pas testé avec plusieurs. Il y a une petite modification à faire pour que ça fonctionne bien dans l'expression régulière.

<?php
$sexe = 'm';
$txt = 'Je suis {un/une} {homme/femme}';
if ($sexe == 'm') {
    $txt = preg_replace('/\{(.*?)\/(.*?)\}/', '$1', $txt);
} else {
    $txt = preg_replace('/\{(.*?)\/(.*?)\}/', '$2', $txt);
}
echo $txt;
?>
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
Tu peux toujours utiliser la fonction preg_replace pour faire ce genre de truc. C'est assez simple, il faut juste bien construire son expression régulière.

Pour le premier élément dans les accolades, utilise $1 comme paramètre de remplacement et $2 pour le deuxième :

preg_replace('/\{(.*)\/(.*)\}/', '$1', $tonTexte); OU
preg_replace('/\{(.*)\/(.*)\}/', '$2', $tonTexte);
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
1
Mais je sais pas à l'avance par quoi remplacer le texte, en fait je ne sais pas du tout ce qu'il y a entre les { }, je sais uniquement le sexe


Espérer le meilleur
Prévoir le pire
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
C'est justement ça que je t'ai proposé ...

<?php
$tonTexte = 'Ton texte ici ...';
if ($sexe == 'masculin') {
    $tonTexte = preg_replace('/\{(.*)\/(.*)\}/', '$1', $tonTexte);
} else {
    $tonTexte = preg_replace('/\{(.*)\/(.*)\}/', '$2', $tonTexte);
}
?>
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
1
Ah ok,

sa marche presque, j'aurais besoin d'une légère modif si sa te dérange pas : en fait dans les blocs {M/F}, l'une des deux parties peut etre vide

exemple : "je suis un{/e} {homme/femme}"

j'ai essayais avec ton code, et le premier bloc pose problème, dans le cas feminin il m'affiche "Je suis unfemme" et dans le cas masculin il m'affiche "Je suis un/e} {homme"

Merci d'avance


Espérer le meilleur
Prévoir le pire
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
1
En fait sa marche pas des masses :
<?php
$sexe = 'm';
$txt = 'Je suis {un/une} {homme/femme}';
if ($sexe == 'm') {
    $txt = preg_replace('/\{(.*)\/(.*)\}/', '$1', $txt);
} else {
    $txt = preg_replace('/\{(.*)\/(.*)\}/', '$2', $txt);
}
echo $txt;
?>


Avec sexe =='m' sa me donne : "Je suis un/une} {homme"
Avec sexe =='f' sa me donne : "Je suis femme"


Espérer le meilleur
Prévoir le pire
Messages postés
195
Date d'inscription
mardi 22 février 2005
Statut
Membre
Dernière intervention
26 octobre 2009
1
Cool merci, sa marche au poil !


Espérer le meilleur
Prévoir le pire