Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

expression reguliere : casse tete !

4 réponses
Avatar
cepiat
Bonjour a tous et merci d'avance pour ceux qui prendront le temps de me lire
galère galère y vas plus me rester beaucoup de cheveux sur la tête .

Voici mon souci , je souhaiterais extraire tous les nom de membres d'une
chaîne sachant que le nom de membres sont compris entre - -
voici la chaîne de départ :

Commentaires :
Nouvelles réalisations en ligne chez: - leonicathy - Mag - milka -
maelis - Somosaique - Titeperle - Babeth - Nikita - CHAT - echauray -
ValerieB59 - garance -


voici mon expression regguliare avec preg match
Citation:
preg_match_all("/\- [\w]+ \-/",$chaine, $tab);
ou
preg_match_all("[\-[\w]+\-]",$chaine, $tab);

et le resultat ;
Code:
Array
(
[0] => Array
(
[0] => - leonicathy -
[1] => - milka -
[2] => - Somosaique -
[3] => - Babeth -
[4] => - CHAT -
[5] => - ValerieB59 -
)

)


Comprent pas pourqoui ca me sort un nom sur deux ????
pis comprent pas pourqoui j'arrive pas a me débarasser de - dans la
sortie, j'aimerais avoir juste le nom du membres.

Grrrrrr ca fais 2 heures que j'suis dessus comprend pas ???
help

4 réponses

Avatar
Denis -esp2008-
Bonjour,

voici mon expression regguliare avec preg match
La règle avec les expressions régulières est qu'il faut les utiliser au

minimum. Ici, un appel à explode doit suffire à éclater la
chaîne. http://www.php.net/manual/fr/function.explode.php


Pour répondre à la question :
preg_match_all("/- [w]+ -/",$chaine, $tab);


Va parcourir la chaine ainsi :

[j'attends un tiret, j'ignore]
Nouvelles réalisations en ligne chez:

[je stocke ce qui correspond au format qu'on m'a donné]
- leonicathy -

[j'attends un tiret]
Mag

[je stocke ce qui correspond au format qu'on m'a donné]
- milka -

[j'attends un tiret]
maelis

[je stocke ce qui correspond au format qu'on m'a donné]
- Somosaique -

et ainsi de suite...

Bonne chance avec explode,

--
Denis

Avatar
Antoine Dinimant
Voici mon souci , je souhaiterais extraire tous les nom de membres d'une
chaîne sachant que le nom de membres sont compris entre - -
voici la chaîne de départ :


si tu veux juste la solution (désespérément simple), elle est à la fin
de ce message. Mais si tu veux en apprendre un peu plus sur les regex,
prends le temps de lire le décorticage de tes expressions...

voici mon expression regguliare avec preg match
Citation:
preg_match_all("/- [w]+ -/",$chaine, $tab);


le - n'a pas de signification particulière en-dehors d'une classe (càd
en-dehors des []), donc il est inutile de l'échapper (le protéger) par
un . Ensuite, w n'a pas besoin d'être dans une classe. Tu peux donc
simplifier cette regex en /- w+ -/

ou
preg_match_all("[-[w]+-]",$chaine, $tab);


dans celle-là, tu oublies les espaces autour des -, ça ne peut donc rien
te ramener

...

Comprent pas pourqoui ca me sort un nom sur deux ????


c'est parfaitement normal. Quand ta regex a reconnu "- leonicathy -",
elle est arrivée après le deuxième tiret (on dit plus techniquement
qu'elle a "consommé" le texte jusqu'à ce deuxième tiret inclus). Elle
continue à partir de là, et n'a donc plus de tiret avant Mag. La
prochaine reconnaissance est bien - milka - qui à son tour consomme le
tiret de Maelis...

pis comprent pas pourqoui j'arrive pas a me débarasser de - dans la
sortie, j'aimerais avoir juste le nom du membres.


tu l'as demandé dans ta regex, il serait donc très inquiétant que tu ne
l'aies pas !

Sur le principe, tu pourrais par ex. utiliser /- (w+) -/ et récupérer
$tab(1), ou encore utiliser un "look ahead" positif (?=...) et un "look
behind" positifs (?<=...) qui résoudraient ton pb de consommation du
tiret. Le "look ahead" positif, ou "assertion avant positive" signifie
"est suivi par" mais sans consommer son contenu :

/(?<=- )w+(?= -)/

ainsi ta regex ne reconnaît que w+, mais en s'assurant qu'il y a bien
un tiret de chaque côt

Mais en réalité, tu utilises la mauvaise fonction. Ce que tu veux, c'est
extraire des portions de texte selon un séparateur, ce sont les
fonctions split qui te font ça. Donc par ex. pour toi

$tab = preg_split('/ - /', $chaine) ;

Maintenant, tu remarqueras que ton séparateur est toujours le même. Tu
n'as donc absolument pas besoin de regex pour cela :

$tab = explode(' - ', $chaine) ;

ou si ta chaîne commence et se termine par un "-" et non par un espace :

$tab = explode(' - ', " $chaine ") ;

Grrrrrr ca fais 2 heures que j'suis dessus comprend pas ???
help


c'est le métier qui rentre !

Bon courage,

Antoun

Avatar
ED
cepiat wrote:

Comprent pas pourqoui ca me sort un nom sur deux ????


parce que dans "- 1 - 2 - 3 - 4 -", tu manges "- 1 -" avec la première
occurence, il te reste " 2 - 3 - 4 -". Comme tu le vois il n'y a plus de
tiret au départ pour valider le 2. Tu perd ainsi une occurence sur deux.

pis comprent pas pourqoui j'arrive pas a me débarasser de - dans la
sortie, j'aimerais avoir juste le nom du membres.

Grrrrrr ca fais 2 heures que j'suis dessus comprend pas ???



Pour pouvoir prendre toutes les occurences il faut faire ce qu'on
appelle une assertion : (?=xxxx) veut dire "les caractères qui suivent
doivent être xxx" mais ne les "utilise" pas. Ils restent accessible pour
la suite. Ton expression devient donc : /- w+ (?=-)/

Après pour récupérer le contenu sans les tirets il faut que tu fasses
une capture. Ça se fait en mettant en parenthèses le contenu que tu veux
isoler. Ton expression deviendra /- (w+) (?=-)/

Au final : preg_match_all('/- (w+) (?=-)/',$chaine, $tab);
et tu récupères tes différents noms dans $tab[1]

--
Eric Daspet
*
Vous cherchez une doc sur PHP 5 ? *PHP 5 avancé*, aux éditions Eyrolles
http://www.eyrolles.com/Informatique/Livre/9782212113235/-PHP-5-avance

Avatar
Paul Delannoy
cepiat a écrit:
Bonjour a tous et merci d'avance pour ceux qui prendront le temps de me
lire
galère galère y vas plus me rester beaucoup de cheveux sur la tête .

Voici mon souci , je souhaiterais extraire tous les nom de membres d'une
chaîne sachant que le nom de membres sont compris entre - -


Essaie explode ?

SINON :

voici mon expression regguliare avec preg match
Citation:
preg_match_all("/- [w]+ -/",$chaine, $tab);
ou
preg_match_all("[-[w]+-]",$chaine, $tab);

et le resultat ;
....

Comprent pas pourqoui ca me sort un nom sur deux ????
Parce que le - de fin du précédent n'est pas REPRIS comme début du

suivant.... en fait tes élément sont {- (qchose)espace} et pas {-qqch-}

pis comprent pas pourqoui j'arrive pas a me débarasser de - dans la
sortie, j'aimerais avoir juste le nom du membres.
Ca tu peux les virer après c'est pas bien dur/


Grrrrrr ca fais 2 heures que j'suis dessus comprend pas ???


Cherches autre chose quand ça coince... c'est plus productif en général