Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Retrouver les noms des variables (Débutent par $)

1 view
Skip to first unread message

Otomatic

unread,
Feb 26, 2020, 1:12:51 PM2/26/20
to
Bonjour,

Toujours le même qui butte, même après un certain temps !

Soit un chaîne de caractères, nommée $Texte, composée de plusieurs
lignes, par exemple :

BigKey0=$w_apacheModules,30,1
BigKey1=Africa,26,$AfricaSep
BigKey2=$America,38,$AmericaSep
BigKey3=Asia,$AsiaNbCol,1
BigKey4=Europe,30,1
BigKey5=$India,$IndiaNbCol,$IndiaSep

Chaque ligne peut comporter ou non des noms de variables PHP, qui donc
commencent par un $.

Je cherche à récupérer uniquement les noms desdites variables.

Ma regex actuelle est :

preg_match_all('~(\$[a-zA-Z0-9_]+).*~m',$Texte,$matches);

Mais je ne récupère que la première variable de chaque ligne :

[26-Feb-2020 19:08:25 Europe/Paris] matches=Array
(
[0] => Array
(
[0] => $w_apacheModules,30,1
[1] => $AfricaSep
[2] => $America,38,$AmericaSep
[3] => $AsiaNbCol,1
[4] => $India,$IndiaNbCol,$IndiaSep
)

[1] => Array
(
[0] => $w_apacheModules
[1] => $AfricaSep
[2] => $America
[3] => $AsiaNbCol
[4] => $India
)

)

Et je “merdoie” lamentablement malgré le cours d'Olivier de 2010 !

Merci.
--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit
nouveau, même si c'est pire qu'avant et cela de toute évidence.
Henry de Montherlant - Va jouer avec cette poussière

Olivier Miakinen

unread,
Feb 26, 2020, 5:43:24 PM2/26/20
to
Bonjour,

Le 26/02/2020 19:12, Otomatic a écrit :
>
> Soit un chaîne de caractères, nommée $Texte, composée de plusieurs
> lignes, par exemple :
>
> BigKey0=$w_apacheModules,30,1
> BigKey1=Africa,26,$AfricaSep
> BigKey2=$America,38,$AmericaSep
> BigKey3=Asia,$AsiaNbCol,1
> BigKey4=Europe,30,1
> BigKey5=$India,$IndiaNbCol,$IndiaSep
>
> Chaque ligne peut comporter ou non des noms de variables PHP, qui donc
> commencent par un $.
>
> Je cherche à récupérer uniquement les noms desdites variables.
>
> Ma regex actuelle est :
>
> preg_match_all('~(\$[a-zA-Z0-9_]+).*~m',$Texte,$matches);
>
> Mais je ne récupère que la première variable de chaque ligne :

C'est à cause du « .* » qui consomme toute la fin de la ligne lorsque
tu as trouvé une occurrence.

D'ailleurs :

> [26-Feb-2020 19:08:25 Europe/Paris] matches=Array
> (
> [0] => Array
> (
> [0] => $w_apacheModules,30,1
> [1] => $AfricaSep
> [2] => $America,38,$AmericaSep
> [3] => $AsiaNbCol,1
> [4] => $India,$IndiaNbCol,$IndiaSep
> )

Regarde par exemple l'élément [0][2] : "$America,38,$AmericaSep" correspond
à la recherche (sans les parenthèses de capture) \$[a-zA-Z0-9_]+.* sur la
ligne "BigKey2=$America,38,$AmericaSep".

C'est-à-dire que tu n'as pas le début "BigKey2=" parce que ta recherche
commence au signe $, mais tu as la fin ",38,$AmericaSep" du fait du .*

> [1] => Array
> (
> [0] => $w_apacheModules
> [1] => $AfricaSep
> [2] => $America
> [3] => $AsiaNbCol
> [4] => $India
> )

Ici en revanche les parenthèses de capture ne récupèrent que "$America"
dans "$America,38,$AmericaSep".

J'ai donc deux conseils :
1) Supprime « .* » et tu auras les mêmes résultats dans $matches[0] et
$matches[1], avec toutes les variables sans exception.
2) Supprime aussi les parenthèses, et tu n'auras plus que $matches[0]
et pas de $matches[1], mais avec toutes les valeurs que tu souhaites.

preg_match_all('~\$[a-zA-Z0-9_]+~m',$Texte,$matches);

Cordialement,
--
Olivier Miakinen

Otomatic

unread,
Feb 27, 2020, 4:08:44 AM2/27/20
to
Olivier Miakinen <om+...@miakinen.net> écrivait :

> preg_match_all('~\$[a-zA-Z0-9_]+~m',$Texte,$matches);

Merci.

Je me doutais bien que ça avait à voir avec ta première leçon du
15 juin 2010 : « consommer » ou « capturer », mais je n'arrivais pas à
mettre le doigt dessus.

Olivier Miakinen

unread,
Feb 27, 2020, 12:25:43 PM2/27/20
to
Le 27/02/2020 à 10:08, Otomatic a écrit :
>
> Je me doutais bien que ça avait à voir avec ta première leçon du
> 15 juin 2010 [...]

Bon sang... 2010 ? Putain, dix ans ! (¹)

--
Olivier Miakinen
¹<https://www.youtube.com/watch?v=0fZDppi5KGo>

SAM

unread,
Mar 27, 2020, 2:05:09 PM3/27/20
to
Le 26/02/2020 à 19:12, Otomatic a écrit :
> Bonjour,
>
> Ma regex actuelle est :
>
> preg_match_all('~(\$[a-zA-Z0-9_]+).*~m',$Texte,$matches);

cette règle n'est-elle pas un peu compliquée ?
Ne peut-on pas rechercher seulement :
\$\w+

($ suivi de tout caractère qui soit alpha-numérique )


> Mais je ne récupère que la première variable de chaque ligne :

Je connais pas trop le php mais en JavaScript on fait :

var maReg = new RegExp( r, "gi");

où r = l'expression de recherche
g = recherche multiple
i = sans casse (peu importe majuscules/minuscules)

après on fait, par exemple :

m = t.match(re); // t = chaine à explorer
alert(m)


il doit bien il y avoir un truc en php pour le choix "g" ???

Exemple en JS :

var t = 'BigKey0=$w_apacheModules,30,1'+
'BigKey1=Africa,26,$AfricaSep'+
'BigKey2=$America,38,$AmericaSep'+
'BigKey3=Asia,$AsiaNbCol,1'+
'BigKey4=Europe,30,1'+
'BigKey5=$India,$IndiaNbCol,$IndiaSep';

var re= new RegExp( /\$\w+/ ,"g");

alert( t.match(re).join('\n') ); // t.match(re) est une espèce d'array
// on joint les éléments par un retour

SAM

unread,
Mar 27, 2020, 2:23:58 PM3/27/20
to
Le 27/02/2020 à 18:25, Olivier Miakinen a écrit :
>
> Bon sang... 2010 ? Putain, dix ans ! (¹)

et au bon souvenir d'Olivier voici de 2009 :

http://pagesperso-orange.fr/stephane.moriaux/truc/js_regexp_testeur_om.shtml


Date de la page affichée : faire dans la console de Fx :
alert(document.lastModified);

--
Stéphane Moriaux avec/with iMac-intel


SAM

unread,
Mar 27, 2020, 2:26:32 PM3/27/20
to
Le 27/02/2020 à 18:25, Olivier Miakinen a écrit :
>> 15 juin 2010 [...]
>
> Bon sang... 2010 ? Putain, dix ans ! (¹)

et ça ?
te souviens-tu ?
2009 !

http://stephane.moriaux.pagesperso-orange.fr/truc/js_regexp_testeur_om.shtml

dans la console faire :
alert(document.lastModified);


Otomatic

unread,
Mar 27, 2020, 3:24:36 PM3/27/20
to
SAM <stephanemor...@wanadoo.fr.invalid> écrivait :

> > preg_match_all('~(\$[a-zA-Z0-9_]+).*~m',$Texte,$matches);
>
> cette règle n'est-elle pas un peu compliquée ?
> Ne peut-on pas rechercher seulement :
> \$\w+
En fin de compte j'ai transformé tout ça en :

//Extract [BigMenu]...[StartupAction]
$mask = "~
(\[BigMenu\] # beginning : [BigMenu]
.*? # we stop as soon as possible
)\[StartupAction\]\s*\n # end : [StartupAction]
~isx";
preg_match($mask,$tpltemp,$matches);

De manière à pouvoir remplacer tout le bloc s'il ne correspond pas à ce
qu'il devrait être.
--
Un ordinateur résout des problèmes que nous n'aurions pas sans lui
Technique aéronautique : http://aviatechno.net

Olivier Miakinen

unread,
Mar 28, 2020, 5:46:28 AM3/28/20
to
Le 27/03/2020 19:05, SAM a écrit :
>

Stéphane ! Ça fait plaisir de te voir !

>> preg_match_all('~(\$[a-zA-Z0-9_]+).*~m',$Texte,$matches);
>
> cette règle n'est-elle pas un peu compliquée ?

Oui. J'avais proposé \$[a-zA-Z0-9_]+ à la place.

> Ne peut-on pas rechercher seulement :
> \$\w+
>
> ($ suivi de tout caractère qui soit alpha-numérique )

Je me méfie comme la peste de \w, \W, \b et \B, pour la raison suivante :

<https://www.php.net/manual/fr/regexp.reference.escape.php>
La définition des lettres et chiffres est définie par les tables de caractères
de PCRE, et peut varier suivant la table locale de caractères. Par exemple, dans
la configuration "français" ("fr"), certains caractères ont des codes supérieurs
à 128, pour les caractères accentués, et ils seront compris par le métacaractère
\w.
</>

En JavaScript, j'ai essayé de trouver la même chose concernant \w dans la doc
de référence ECMA-262. Il semble que le comportement change selon que tu aies
le flag u (Unicode) ou non. Cela me fait me méfier encore plus de \w en tant
que remplacement de [a-zA-Z0-9_], parce que tu peux avoir une regexp qui
fonctionne, et puis un jour tu y rajoutes le flag u pour un truc ailleurs que
ce \w et du coup tout foire de façon inexpliquable !

>> Mais je ne récupère que la première variable de chaque ligne :
>
> Je connais pas trop le php mais en JavaScript on fait :
>
> var maReg = new RegExp( r, "gi");
>
> où r = l'expression de recherche
> g = recherche multiple
> i = sans casse (peu importe majuscules/minuscules)
>
> après on fait, par exemple :
>
> m = t.match(re); // t = chaine à explorer
> alert(m)
>
>
> il doit bien il y avoir un truc en php pour le choix "g" ???

Oui, c'est d'utiliser preg_match_all() comme l'a fait Otomatic au lieu
de preg_match() qui fait une recherche unique.

>
> Exemple en JS :
>
> var t = 'BigKey0=$w_apacheModules,30,1'+
> 'BigKey1=Africa,26,$AfricaSep'+
> 'BigKey2=$America,38,$AmericaSep'+
> 'BigKey3=Asia,$AsiaNbCol,1'+
> 'BigKey4=Europe,30,1'+
> 'BigKey5=$India,$IndiaNbCol,$IndiaSep';
>
> var re= new RegExp( /\$\w+/ ,"g");
>
> alert( t.match(re).join('\n') ); // t.match(re) est une espèce d'array
> // on joint les éléments par un retour
>

Je suis d'accord, ça fonctionne très bien, avec juste le risque lié à \w
au lieu de [a-zA-Z0-9_].

--
Olivier Miakinen

Otomatic

unread,
Mar 28, 2020, 9:07:25 AM3/28/20
to
Olivier Miakinen <om+...@miakinen.net> écrivait :

> Cela me fait me méfier encore plus de \w en tant
> que remplacement de [a-zA-Z0-9_], parce que tu peux avoir une regexp qui
> fonctionne, et puis un jour tu y rajoutes le flag u pour un truc ailleurs que
> ce \w et du coup tout foire de façon inexpliquable !
Je suis bien d'accord !
Je n'autorise QUE [a-zA-Z0-9_] et rien d'autre.
Dans aucune des regexp que j'utilise il n'y a un quelconque remplacement
d'une classe par \w ou autre type.
0 new messages