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 24/06/2006, 10h30   #1
Candidat au titre de Membre du Club
 
Inscription : juillet 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 33
Points : 12
Points : 12
Par défaut Difficultés avec une expression réguliere

Bonjour tout le monde,

Je viens vous demander un petit coup de main sur une expression reguliere qui sera pour vous très simple mais moi j'ai beau essayer d'y arriver c'est pas mon truc!

Je dois parser un fichier html pour y rechercher la chaine de caractere %s et la remplacer par autre chose. Dans mon exemple ca sera ce brave TOTO.
Ce code m'est utile afin d'y appliquer par la suite un vprintf. Enfin bref pour celà j'ai écris ceci :
Code :
$squelette = ereg_replace("%[^s]","TOTO",$squelette);
Mon problème c'est que celà transforme tous les
Citation:
width="20%"
en
Citation:
width="20%

Mais ca fonctionne quand même pour mes %s.


merci de voter aide
saint-pere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 11h37   #2
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Et pourquoi pas faire
Code :
$squellette = str_replace("%s", "TOTO", $squelette);
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 11h41   #3
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
dans ce cas précis, tu peux utiliser la fonction printf() ou sprintf()

exemple :
Code :
1
2
3
4
5
6
7
 
$texte = "ma valeur est : %s";
$mavar = "une valeur quelconque";
 
$texte = sprintf( $texte, $mavar);
 
echo $texte;
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 11h50   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

+1, utilise la fonction sprintf() qui est prévue pour cela.
Au passage, concernant les regex, je te recommande d'éviter la norme POSIX au profit des PCRE : http://g-rossolini.developpez.com/tu...ns-regulieres/
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 12h28   #5
Candidat au titre de Membre du Club
 
Inscription : juillet 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 33
Points : 12
Points : 12
Merci de vos réponses.


Non je ne peux pas utiliser sprintf tout simplement car mon code à 2 fonctions: il affiche une vue schematique coté admin ET une vue réelle coté visiteur. Pour celà je dois utiliser la fonction vsprintf.

Pour la petite histoire je fais un portail/salle d'arcade pour phpbb. Donc dans un premier temps je parses des modeles de structures en HTML où %s symbolise l'emplacement d'un bloc que je remplace par l'identifiant du bloc réel affiché.


Ensuite en fonction de l'endroit où je me trouve soit il affiche le bloc, soit sa déscription.

coté admin ca ressemble à ca :


et coté visiteur ca donne ca :
http://www.yep-yop.com/gf_arcade/arcade.php

Le code qui me permet de faire ca c'est ca:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
	//
	// assemble du squelette
	// 
	function assembler_squelette($sortie='direct')
	{
		global $db;
 
		$squelette = '';
		$liste_feuille= array();
 
		$sql = 'SELECT modele, f.id_feuille, id_bloc, a.id_mod , nom  
				FROM '. ARCADE_FEUILLE .' as f LEFT JOIN '. ARCADE_BLOCS .' as b 
				ON f.id_feuille=b.id_feuille 
				LEFT JOIN '. ARCADE_MODELE .' as m 
				ON f.id_modele=m.id_modele 
				LEFT JOIN '.ARCADE_MODS.' as a 
				ON b.id_mod=a.id_mod 
				WHERE id_squelette='.$this->id_squelette.' 
				ORDER BY position ASC
				';
		if( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, "Impossible d'obtenir des infos sur les feuilles", '', __LINE__, __FILE__, $sql); 
		}
 
		while ($row = $db->sql_fetchrow($result))
		{
 
			if (!in_array($row['id_feuille'],$liste_feuille))
			{
 
				$liste_feuille[] = $row['id_feuille'];
				$squelette .= stripslashes($row['modele']);
			}
			if ($sortie == 'cache')
			{
				$this->liste_blocs[] = '{'.$row['nom'].'}';		
				if ($row['nom'] != '') $this->liste_mods[] = $row['nom'];				
			}else{
				$this->liste_blocs[] = '%'.$row['id_bloc'].'%';			
				$this->liste_mods[] = $row['id_mod'];	
			}
 
 
 
		}
		$squelette = ereg_replace("%[^s]","percent",$squelette);
		$squelette  = vsprintf($squelette,$this->liste_blocs);
		$this->squelette = str_replace("percent","%",$squelette);
		if ($sortie == 'cache') $this->squelette = str_replace("{}","",$this->squelette);
	}
L'ensemble est alors envoyé dans 2 fichiers qui me servent de cache :
http://www.yep-yop.com/gf_arcade/arc...quelette_4.tpl qui me crée un fichier tpl dynamique

et

http://www.yep-yop.com/gf_arcade/arc...he/blocs_4.txt qui m'affiche la liste des blocs à charger.

Voilà j'espere avoir été assez complet/concis dans mon explication afin que vous voyez ce que j'ai fais et pourquoi je l'ai fais.
saint-pere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 12h53   #6
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Dans ton pemier message tu dis vouloir remplacer %s par TOTO, or ton regexp dit "remplacer %X avec X différent de s", c'est pas pas logique

Et puis le str_replace() n'est pas utile?
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 13h02   #7
Candidat au titre de Membre du Club
 
Inscription : juillet 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 33
Points : 12
Points : 12
je suis en train de reprendre ce code que j'ai fais il y a un moment et je me rend compte que je vous ai dis une grosses connerie. Excusez moi


Effectivement je veux pouvoir AVANT de parser les %s virer tous les sigles % afin que la fonction printf ne les parses pas!

si on prend un exemple tout bete :
Code :
<table><tr><td width="20%">%s</td></table>
printf va aussi considérer 20% comme un marqueur.
saint-pere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 13h26   #8
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
Code :
preg_replace("#%s#","TOTO", $chaine);
ca va te remplacer tout les %s par TOTO dans ta chaine $chaine.

Si ce n'est pas exactement cela que tu veux faire, donne nous un exemple de ce que tu veux faire.
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 13h34   #9
Candidat au titre de Membre du Club
 
Inscription : juillet 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 33
Points : 12
Points : 12
je veux remplacer tous les caracteres % par autre chose SAUF les %s

Ca pourrait donner ca :
width="20%" => width="20TOTO"
width=20% => width=20TOTO
blablabla %s => blablabla %s
%%s => TOTO%s
saint-pere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 13h42   #10
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
Code :
preg_replace("#%([^s])#","#$1", $chaine);
ca devrait marcher sans probleme !!

tu y étais presque sauf qu'il fallait récupérer ce [^s] dans $1 et le remettre

Voila !!
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2006, 13h47   #11
Candidat au titre de Membre du Club
 
Inscription : juillet 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 33
Points : 12
Points : 12
nickel Merci Mr Maxoo Je te mettrai dans les remerciements
saint-pere 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 23h30.


 
 
 
 
Partenaires

Hébergement Web