expressions regulieres

Eléphanteau du PHP | 16 Messages

14 sept. 2007, 19:27

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 :wink:[/b]
Modifié en dernier par ichiro le 18 sept. 2007, 17:13, modifié 2 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

14 sept. 2007, 20:15

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.

Code : Tout sélectionner

"#\[.*\]#Ui"
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 16 Messages

14 sept. 2007, 20:41

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 :cry: . Est ce du au fait qu'il rencontre un autre crochet [ ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

15 sept. 2007, 00:24

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()
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 16 Messages

17 sept. 2007, 16:22

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 ...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 sept. 2007, 16:53

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é :-k

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 16 Messages

17 sept. 2007, 18:13

oki pour l'exemple :wink:
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 :merci:

ViPHP
AB
ViPHP | 5818 Messages

17 sept. 2007, 23:21

oki pour l'exemple :wink:
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 :merci:
[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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 sept. 2007, 12:51

Très juste :wink:

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à :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 16 Messages

18 sept. 2007, 14:40

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 :wink:

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 :P

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 sept. 2007, 15:42

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 [].

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 1380 Messages

18 sept. 2007, 16:03

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);
ripat

Eléphanteau du PHP | 16 Messages

18 sept. 2007, 17:11

merci a vous les deux solutions marchent :D . Faut que je traffic un peu mais je devrai m'en sortir ^^.Le post est résolu :wink: