Nouveau sujet Répondre Imprimer Syndication RSS 2.0

Regex :(

je vais péter un câble :(
Feu follet
Avatar de FumSteph
  • Age : 33 ans
  • Messages : 153
  • Inscrit : 14 Février 2008
Message édité 2 fois, dernière édition par FumSteph, 28 Juin 2009, 21:24     Lien vers ce message 28 Juin 2009, 21:21
Salut tout le monde,

Alors voila, j'ai besoin de faire un genre de parse sur des variables dans une chaine.

En gros, j'ai un formulaire que peuvent modifier mes membres et je veux mettre à dispo certaines variables genre, pseudo, date, et que sais-je encore ...

Bref, du coup je voulais faire un peu comme avec les moteurs de templates, mettre mes variables comme ça {pseudo}.

L'idée que j'avais était de splitter la totalité de la chaine en collant dans un tableau le nom des variables.

Par exemple "Bonjour {pseudo}, nous sommes le {date} !" doit donner $array[0]=pseudo $array[1]=date

Pour cela, je me suis dit, chouette il existe preg_split, mais j'ai essayé des trucs genre
$array = preg_split('#\{(.+)\}#U',$chaine)
et je ne sais combien de solution, mais je sèche, je n'arrive jamais au résultat voulu?

J'ai besoin d'un expert en regex, je suis trop naze :(

Merci d'avance.

Steph
 
Equipe des MODS
Avatar de Grummfy
  • Age : 25 ans
  • Messages : 5943
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 28 Juin 2009, 21:28
rapidement : http://www.expreg.com/


"La gravité est le bonheur des imbéciles" Charles de Montesquieu > "T'as raison, L'apesanteur c'est plus rigolo" Hébus de Phalompe (Troll de Troy)
Mods fsb1 - Mods fsb2 - Grummfy's project - Zf Planet
 
Feu follet
Avatar de FumSteph
  • Age : 33 ans
  • Messages : 153
  • Inscrit : 14 Février 2008
  Lien vers ce message 28 Juin 2009, 21:30
J'ai regardé déjà Grummfy et le site du zéro aussi, j'arrive parfois a un résultat parcellaire mais jamais à ce que je veux :(

j'y suis depuis des heures, je m'arrache les cheveux :(
 
Equipe des MODS
Avatar de Grummfy
  • Age : 25 ans
  • Messages : 5943
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 28 Juin 2009, 21:53
je te conseil aussi ceci : http://java.developpez.com/out...=tester#regexsr et http://cyberzoide.developpez.com/java/regex/



sinon

$str = 'Bonjour {pseudo}, nous sommes le {date} !';

$pattern = '#^Bonjour (.*), nous sommes le (.*) !#';

preg_match($pattern, $str, $matches);

var_dump($matches);

preg_match_all($pattern, $str, $matches);

var_export($matches);


"La gravité est le bonheur des imbéciles" Charles de Montesquieu > "T'as raison, L'apesanteur c'est plus rigolo" Hébus de Phalompe (Troll de Troy)
Mods fsb1 - Mods fsb2 - Grummfy's project - Zf Planet
 
Chef du projet FSB
Avatar de Genova
  • Age : 24 ans
  • Messages : 14653
  • Inscrit : 16 Septembre 2004
Message édité 1 fois, dernière édition par Genova, 28 Juin 2009, 21:56     Lien vers ce message 28 Juin 2009, 21:56
$str = str_replace('{pseudo}', $pseudo, $str);

???

Pourquoi faire compliquer ;)


Cause Im as free as a bird now, And this bird you can not change. - Freebird - Lynyrd Skynyrd
There's someone in my head but it's not me. - Brain damage - Pink Floyd
I said baby, you know Im gonna leave you. - Babe I'm gonna leave you - Led Zeppelin
Father ? yes son, I want to kill you - The end - The Doors
 
Feu follet
Avatar de Duffy
  • Age : 22 ans
  • Messages : 245
  • Inscrit : 07 Février 2006
Message édité 2 fois, dernière édition par Duffy, 28 Juin 2009, 21:58     Lien vers ce message 28 Juin 2009, 21:57
Sinon il y a aussi :
preg_match_all('#\{(.*?)\}#',$str,$result);


Donne le résultat :
Citation

Array
(
[0] => Array
(
[0] => {pseudo}
[1] => {date}
)

[1] => Array
(
[0] => pseudo
[1] => date
)

)



http://cache.www.gametracker.com/server_info/91.121.45.136:27016/b_350x20_C692108-381007-FFFFFF-000000.png
 
Equipe des MODS
Avatar de Grummfy
  • Age : 25 ans
  • Messages : 5943
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 28 Juin 2009, 22:00
je pensait qu'il voulait simplement extraire des noms qui rempalcerait les {pseudo} par toto, grummfy ou genova donc que cela marche en tout cas ...


"La gravité est le bonheur des imbéciles" Charles de Montesquieu > "T'as raison, L'apesanteur c'est plus rigolo" Hébus de Phalompe (Troll de Troy)
Mods fsb1 - Mods fsb2 - Grummfy's project - Zf Planet
 
Feu follet
Avatar de FumSteph
  • Age : 33 ans
  • Messages : 153
  • Inscrit : 14 Février 2008
Message édité 1 fois, dernière édition par FumSteph, 28 Juin 2009, 22:12     Lien vers ce message 28 Juin 2009, 22:05
Merci :)

Je pencherais plus pour la solution de Duffy, car je peux avoir plusieurs variables, je ne peux baser le pattern sur rien excepté les {} puisque je vais utiliser cette fonction sur plusieurs pages avec plusieurs textes.

J'ai aussi essayé un truc du genre

preg_replace ('#\{(.+)\}#Ui','$1', $chaine);


mais ça m'affiche $pseudo et $test par exemple au lieu de leur valeur.

C'est vrai que si je fais un tableau, je vais encore devoir faire une boucle, encore une regex pour tester la même chose et remplacer par la bonne variable.

Si ya moyen avec un seul preg_replace, je prends :)
 
Chef du projet FSB
Avatar de Genova
  • Age : 24 ans
  • Messages : 14653
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 28 Juin 2009, 22:23
Ouai sauf que le jour ou le mec entre {tutu} et que ta variable $tutu n'existe pas tu auras une belle erreur, voire une belle faille de sécurité ;)

Si tu sais déjà tes variables, autant utiliser str_replace(), c'est bien plus performant que les regexp, et pas de soucis de sécurité.


Cause Im as free as a bird now, And this bird you can not change. - Freebird - Lynyrd Skynyrd
There's someone in my head but it's not me. - Brain damage - Pink Floyd
I said baby, you know Im gonna leave you. - Babe I'm gonna leave you - Led Zeppelin
Father ? yes son, I want to kill you - The end - The Doors
 
Feu follet
Avatar de FumSteph
  • Age : 33 ans
  • Messages : 153
  • Inscrit : 14 Février 2008
  Lien vers ce message 29 Juin 2009, 6:47
Bon Geno, j'ai écouté ton conseil, j'ai donc finalement fais une tite fonction à qui je passe ma chaine en paramètre et les variables à "parser", du coup ça donne :

function parse_xml_vars($str,$vars) {
	
	if (is_array($vars) && !empty($str)) {
		foreach ($vars as $var=>$value) {
			$str = preg_replace ('#\{('.$var.')\}#Ui',$value, $str);
		}
	}
	else {
		trigger_error("Paramètres invalides", E_USER_ERROR);
	}
	return ($str);
}

$str = "bonjour {pseudo} ! Ceci est un test {test}";


$vars = array(
	'pseudo'=>'Steph',
	'test'=>'eh eh');
	
$test = parse_xml_vars($str,$vars);

echo $test;


Ca m'affiche bien "bonjour Steph ! Ceci est un test eh eh"

Merci pour votre aide, ça m'a aidé à repenser mon truc, c'est fou ce qu'on peut se faire des noeuds au cerveau des fois lol

++

Steph
 
Hors ligne mob Masculin
Equipe de support
Avatar de mob
  • Age : 19 ans
  • Messages : 2011
  • Inscrit : 10 Septembre 2005
Message édité 1 fois, dernière édition par mob, 29 Juin 2009, 10:05     Lien vers ce message 29 Juin 2009, 10:05
Salut, tu n'as pas besoin de preg_replace, str_replace peut faire ce que tu veux, et est plus rapide qu'une regex.


Anciennement B.Moncef.
 
Feu follet
Avatar de FumSteph
  • Age : 33 ans
  • Messages : 153
  • Inscrit : 14 Février 2008
  Lien vers ce message 29 Juin 2009, 13:12
C'est fait :)

Fonction modifiée en :

function parse_xml_vars($str,$vars) {
	
	if (is_array($vars) && !empty($str)) {
		foreach ($vars as $var=>$value) {
		     $str = str_replace ('{'.$var.'}',$value, $str);
		}
	}
	else {
		trigger_error("Paramètres invalides", E_USER_ERROR);
	}
	return ($str);
}


Merci :)
 
Répondre


.