Page 1 sur 1
expressions regulieres
Posté : 14 sept. 2007, 19:27
par ichiro
Bonjour a tous,
J'aimerai remplacer une partie de chaine de caractère comprise entre [ et ] par un espace.
Je ne sais pas comment indiquer à la fonction ereg_replace l'expression approprié. Mon dernier test (qui ne marche pas evidemant ^^)
$nom="[team]nom_ep-[team].avi";
$change=ereg_replace('_|-',' ',$nom);
$change=ereg_replace('[*]',' ',$change);
echo "nom original:".$nom."</br>";
echo "<br>changement :".$change."</br>";
Un coup de patte plz

[/b]
Posté : 14 sept. 2007, 20:15
par Ryle
Dans les expressions régulière, le crochet est utilisé pour délimiter les classes. Si c'est le caractères crochet que tu recherches, il te faut le protéger d'un antislash pour éviter la confusion.
Par ailleurs, l'étoile indique le nombre d'occurence d'un caractère ou d'une chaine (à savoir de 0 à n). Il doit donc suivre le caractère (ou la chaine) répété(e). Et si ce caractère peut être n'importe quel caractère, alors on le symbolie par un point.
Posté : 14 sept. 2007, 20:41
par ichiro
C'est presque ça mais il semblerai que le ] ne "referme" pas l'expression. Voila ce que ca m'affiche:
nom original:[team]nom_ep-[team].avi
changement : .avi
Je comprend pas trop pourquoi ça marche pas

. Est ce du au fait qu'il rencontre un autre crochet [ ?
Posté : 15 sept. 2007, 00:24
par Ryle
Hum.. enlève l'option U dans l'expression, il prend en fait la correspondance la plus large au lieu de distinguer les deux...
A noter qu'il est recommandé de préférer preg_replace() qui est plus rapide que ereg_replace()
Posté : 17 sept. 2007, 16:22
par ichiro
J'ai fais le changement que tu m'a demandé et voila ce que ça me retourne :
nom original:[team]nom_ep-[team].avi
changement :[team]nom ep [team].avi
et quand j'enleve les options
$nom="[team]nom_ep-[team].avi";
$change=ereg_replace('_|-',' ',$nom);
$change=ereg_replace('\[.*\]',' ',$change);
nom original:[team]nom_ep-[team].avi
changement : .avi
je vois pas ou est l'erreur ...
Re: expressions regulieres
Posté : 17 sept. 2007, 16:53
par Truc
J'aimerai remplacer une partie de chaine de caractère comprise entre [ et ] par un espace.
nom original:[team]nom_ep-[team].avi
changement :[team]nom ep [team].avi
Pas bon ?
Si tu nous donnais un exemple concret départ et arrivé

Posté : 17 sept. 2007, 18:13
par ichiro
oki pour l'exemple
Alors voila ce que j'aimerai
nom original:[team]nom_ep-[team].avi
changement :nom ep.avi
Comme je l'ai dis je veux juste supprimer tous ce qui se trouve entre [] pour avoir un affichage épuré.
Merci de votre aide

Posté : 17 sept. 2007, 23:21
par AB
oki pour l'exemple
Alors voila ce que j'aimerai
nom original:[team]nom_ep-[team].avi
changement :nom ep.avi
Comme je l'ai dis je veux juste supprimer tous ce qui se trouve entre [] pour avoir un affichage épuré.
Merci de votre aide

[team] est une balise toujours identique? Je veux dire est-ce que tu ne rencontreras pas par ex [tom]?
Le nom original à changer contient-il une ou plusieurs expression à changer? ex: nom original = '[team]nom_ep-[team].avi taratata [team2]nom2_ep-[team2].avi turlututu';
Difficile de t'aider sans avoir plus de précisions.
Posté : 18 sept. 2007, 12:51
par Truc
Très juste
Tu veux capturer ce qu'il y a entre ces balises + remplacer certains caractères => preg_replace_callback()
Inspire toi de
ce qui existe déjà 
Posté : 18 sept. 2007, 14:40
par ichiro
j'ai deja remplacer certain caractères comme le tiret haut ou le tiret bas à l'aide de
ereg_replace('_|-',' ',$nom)
je veux juste supprimer tous ce qui se trouve entre [] pour avoir un affichage épuré
donc pour te répondre AB ce qu'il peut y avoir à l'interieur des crochets va varier c'est certain, mais je pensais qu'on utilisant les expressions régulières je pourrai séparé les expressions qui débutent par [ et qui finissent par ] pour ensuite les supprimer tout simplement
En ce qui concerne preg_replace_callback() je dois avoué que j'ai pas tout compris encore et je vois pas comment je pourrais m'en servir pour mon script.
J'attend de vos nouvelles

Posté : 18 sept. 2007, 15:42
par Truc
un exemple rapide (peut être pas parfait... trop peu d'infos) :
function replace($v)
{
$v[1] = str_replace("_","",$v[1]);
$v[1] = str_replace("-","",$v[1]);
return $v[1];
}
$s = "bla [team]nom_ep-[team].avi bla";
$s = preg_replace_callback('#\[\w+\](.+)\[\w+\]#','replace',$s);
echo "after : ".$s;
l'expression correspond à toute la partie à remplacer et la capture du mat à garder.
et le callback correspond juste à l'appel de la fonction de remlacement des caractères tels que "-" et "_" pour le mot capturé entre les [].
Posté : 18 sept. 2007, 16:03
par Ripat
Une possibilité parmi d'autres:
// tableau des choses à remplacer [^]]* veut dire tout caractère qui n'est pas un ]
$remplacer = array('#\[[^]]*\]#', '#-_#');
// tableau des remplacements
$par = array('', ' ');
// exécution de la regex
$change = preg_replace($remplacer, $par, $nom);
Posté : 18 sept. 2007, 17:11
par ichiro
merci a vous les deux solutions marchent

. Faut que je traffic un peu mais je devrai m'en sortir ^^.Le post est
résolu 