Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/08/2007, 15h15   #1
Invité régulier
 
Inscription : mai 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 18
Points : 8
Points : 8
Par défaut PB délimiteur dans la fonction "preg_replace"

Boujour,

J'ai un fichier qui est contenue dans une chaine de caractere sur laquel j'utilise la fonction "preg_replace(mixed pattern, mixed replacement, mixed subject)"

Le probleme est que "mixed pattern" doit etre une expression reguliere, c'est pour cela que je rajoute "#" avant et apres mais le probleme c que le pattern et le replacement contienne eux aussi un caractere que preg_replace consdidere comme des délimiteurs : "_" et qui sont en plein millieu de mon pattern et replacement!


Alors comment me debrouillez pour que les "_" ne soit pas considerer comme des délimiteur?

Sachant que jai essayer en mettant un anti slash devans ca n'a rien changer! Il ne me modifie toujours que la premiere partie de la chaine (celle qui est avant le premier "_"!


Merci pour vos futures reponses!
tiliut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 15h26   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
on peut avoir le code correspondant s'il te plait?
Parce qu'il me semble que le but du premier et du dernier caractère dans le pattern est d'être le délimiteur (non présent dans la chaine donc).
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 15h48   #3
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
Ton pattern (et uniquement le pattern) est une regex de type PCRE ok.
La grande différence entre preg et ereg c'est qu'il y a des délimiteurs dans le premier.
Ces délimiteurs sont là pour séparer la partie expression régulière des options (aussi appelés flags) qui vont être utilisés avec elle.

Assez couramment, on utilise le délimiteur # ou ` car ce sont des caractères assez rarement utilisés mais presque nimporte quel caractère peut servir de délimiteur.

Attention toutefois à ce que le caractère qui est utilisé pour délimiteur (prennons pour exemple le #) ne soit pas déja présent DANS la regex (comme par exemple (#<a style="color: #fff">#) car ici le moteur de regex ne comprendrai plus.

Il n'y a pas de délimiteur pré determiné, il y a des méta caractères comme le ., le \, les () et les [] (pour ne citer qu'eux).

Si dans votre regex vous utilisez du texte dont vous ne pouvez pas controler le contenu, utilisez comme délimiteurs un métacaractère et veillez à utiliser preg_quote sur le texte que vous ne controlez pas avant de l'integrer à votre regex. Bien evidemment, si vous meme ajoutez des caractères à dans votre regex, veillez à échapper les métacaractères (pour qu'ils ne soient pas pris comme délimiteurs).

exemple :
Code :
1
2
3
4
5
6
// Variable dont je ne controle pas le contenu (elle pourrais provenir de $_GET par exemple)
$regex = "I love my root."; // Remarquez le . à la fin qui pourrait géner
 
$texte = "Yes I think I love my root."; 
 
preg_match('(.*'.preg_quote($regex).'.*)');
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 16h42   #4
Invité régulier
 
Inscription : mai 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 18
Points : 8
Points : 8
J'utilise preg_replace car il est capable de comprendre les tableaux, ce qui n'est pas le cas de ereg, que j'utilisais avant en réalisant un boucle sur les éléments du tableaux, mais ereg est trop lent et il m'arrivait de dépasser les 30s de temps d'exécution, c'est pour cela que je veut absolument utilisé preg!

Sinon j'avais cité comme exemple de délimiteur # mais ça aurait pu être n'importe quel autre délimiteur, ici j'ai utilisé "/"



Voila pour le code de remplissage des tableaux :

Code :
1
2
3
4
5
6
7
8
9
foreach($listeElement as $element)
{
	$e=$element->getAttribute("id");
//essai ne marchant pas   :  $e=ereg_replace('_','\_',$e);
	$tab_e[$ligneXml] = ($id_film.'_'.$ligneXml);
	$tab_e_indice[$ligneXml] = '/'.$e.'/';
 
	$ligneXml++;
}
Sachant que $e est du type (inchangeable) "elD_22_2" par exemple!

Et voila pour l'utilisation :

Code :
$chaine_xml=preg_replace($tab_e_indice,$tab_e,$chaine_xml);



edit : soluces trouvé sur php.net :

J'ai utilisé une autre fonction au final :

J'ai commencé par creer mon tableaux :
Code :
$temp=array_combine($tab_img_indice,$tab_img);
Puis jai tout remplacé avec la fonction strtr, qui elle ne prend pas en compte les expression reguliere! :
Code :
$chaine=strtr($chaine,$temp);
tiliut est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h20.


 
 
 
 
Partenaires

Hébergement Web