Aide sur expression régulière

Aide sur expression régulière - PHP - Programmation

Marsh Posté le 06-09-2018 à 14:28:40    

Bonjour
 
j'en appelle aux connaisseurs des expressions régulières.
 
En PHP je dois découper une chaîne de caractères et récupérer dans un tableau les segments trouvés.
J'ai vu qu'on pouvait utiliser la fonction preg_match_all pour cela. Maintenant la question est quels sont les patterns à coder.
 
Mon besoin:
Je dois coder une recherche d'élèves qui parlent certaines langues avec un ou plusieurs niveaux associés (3 niveaux possibles:1,2 ou 3). La langue est codée sur 3 caractères.
 
Par exemple je cherche les élèves qui parlent l'anglais (niveaux 1), l'espagnol (niveaux 1 et 2) et le chinois (peu importe le niveau)
 
la string suivante de recherche est la suivante: "ENG(1),ESP(1,2),CHI"
 
Je veux récupérer dans un tableau les séquences suivantes:
Array( 1=> ENG(1), 2=> ESP(1,2), 3=> CHI)
 
Comment coder ça avec une expression régulière ou bien autre chose?
 
Merci par avance

Reply

Marsh Posté le 06-09-2018 à 14:28:40   

Reply

Marsh Posté le 06-09-2018 à 15:40:13    

J'ai pas compris. :o  
Qu'est-ce que tu as comme info dans ta base de données, sous quelle forme exactement c'est stocké que élève X parle les langues Y et Z?
C'est pas plutôt un problème de SQL que de RegEx?

Reply

Marsh Posté le 06-09-2018 à 15:50:30    

J'ai trouvé, pour l'instant ça marche:
preg_match_all('#[a-zA-Z]+\((\d+(,|))+\)|[a-zA-Z]+#',$langues, $langniv);

Reply

Marsh Posté le 07-09-2018 à 15:17:58    

+1
Ce sera surement plus rapide de faire un :

Code :
  1. $tmp = str_replace('),', ');', $str);
  2. $t_tmp = explode(';', $tmp);


que de faire une regex...


Message édité par mechkurt le 07-09-2018 à 15:18:30

---------------
D3
Reply

Marsh Posté le 07-09-2018 à 16:23:35    

Merci :)
Effectivement la proposition de mechkurt est super pratique. Je vais adopter celle là

Reply

Marsh Posté le 08-09-2018 à 21:49:57    

Par contre elle ne fonctionnera pas si tu as un cas où tu dois splitter sans avoir de parenthèse fermante avant.  
Comme un CHI,TRUC ou un ESP,CHI.  
Là tu dois revenir à de la regex (genre split sur "(\w|\))\," sans les guillemets bien sûr).
 
Et +1 contre le blaireau qui a décidé de tout faire avec des virgules :o.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 10-09-2018 à 13:44:34    

A ben chuis partis du principe que il y'avait toujours un niveau entre parenthèse, sinon effectivement ça ne marche pas... ^^


---------------
D3
Reply

Marsh Posté le 10-09-2018 à 14:50:41    

En perl, ce serait ainsi :  

Code :
  1. use strict;
  2. use warnings;
  3. my $data = "ENG(1),ESP(1,2),CHI";
  4. my $i = 1;
  5. my %hash = map {($i++, $_)} split(/(?<=[A-Z)]),/, $data);
  6. # ou my @liste = split(/(?<=[A-Z)]),/, $data); si c'est une liste que tu veux
  7. # et on le vérifie:
  8. my ($first, @others) = sort(keys(%hash));
  9. print "$first => $hash{$first}";
  10. print ", $_ => $hash{$_}" foreach (@others);

E:\Programming\Perl>perl testreg.pl
1 => ENG(1), 2 => ESP(1,2), 3 => CHI


A toi d'adapter au php.
 
A+,


Message édité par gilou le 10-09-2018 à 14:53:32

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed