IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

créer une expression régulière ? [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut créer une expression régulière ?
    Bonjour,

    Je dois créer une expression régulière qui analyse ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TEXTE1 - TEXTE2 NOMBRE1 TEXTE3 - TEXTE4
    TEXTE1 - TEXTE2  TEXTE3 - TEXTE4
    Je dois pouvoir extraire la partie NOMBRE1 TEXTE3 et TEXTE3 des deux différents cas.

    Cependant, je n'arrive pas à le faire...

    Merci pour votre aide,
    ZiP

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Expressions conditionnelles et hop:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $str1 = 'foo - bar 10 baz - foobar';
    $str2 = 'foo - bar  baz - foobar';
     
    $regex = '~(?<mot1>\w+)\s*-\s*(?<mot2>\w+)\s*(?<number>\d+)?\s*(?<mot3>\w+)\s*-\s*(?<mot4>\w+)~';
     
    if (preg_match($regex, $str1, $matches)) {
    	var_dump($matches);
    }
     
    if (preg_match($regex, $str2, $matches)) {
    	var_dump($matches);
    }
    Produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    array
      0 => string 'foo - bar 10 baz - foobar' (length=25)
      'mot1' => string 'foo' (length=3)
      1 => string 'foo' (length=3)
      'mot2' => string 'bar' (length=3)
      2 => string 'bar' (length=3)
      'number' => string '10' (length=2)
      3 => string '10' (length=2)
      'mot3' => string 'baz' (length=3)
      4 => string 'baz' (length=3)
      'mot4' => string 'foobar' (length=6)
      5 => string 'foobar' (length=6)
     
    array
      0 => string 'foo - bar  baz - foobar' (length=23)
      'mot1' => string 'foo' (length=3)
      1 => string 'foo' (length=3)
      'mot2' => string 'bar' (length=3)
      2 => string 'bar' (length=3)
      'number' => string '' (length=0)
      3 => string '' (length=0)
      'mot3' => string 'baz' (length=3)
      4 => string 'baz' (length=3)
      'mot4' => string 'foobar' (length=6)
      5 => string 'foobar' (length=6)

  3. #3
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    Merci pour votre réponse aussi rapide et complète !

    C'est exactement ce que je voulais faire !

    ZiP

  4. #4
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour Benjamin,

    Je viens de tester votre code, il ne fonctionne pas avec mes données.

    Voici un exemple concret :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?php
    	$str1 = 'LE MOTIF DU PROBLEME - NOM DE LA COMMUNE 1 RUE DE LA COMMUNE - VEHICULE 1';
    	$str2 = 'LE MOTIF DU PROBLEME - NOM DE LA COMMUNE  RUE DE LA COMMUNE - VEHICULE 2';
     
    	$regex = '~(?<motif>\w+)\s*-\s*(?<commune>\w+)\s*(?<numero>\d+)?\s*(?<voie>\w+)\s*-\s*(?<vehicule>\w+)~';
     
    	if( preg_match($regex, $str1, $matches) )
    	{
    		echo 'Adresse : '.$matches[2].' '.$matches[3].', '.$matches[1].'<br/>';
    	}
     
    	if( preg_match($regex, $str2, $matches) )
    	{
    		echo 'Adresse : '.$matches[2].' '.$matches[3].', '.$matches[1];
    	}
    ?>
    Je suis en train actuellement de chercher ce qui bloque.

    Merci pour votre aide,
    ZiP

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    	$str1 = 'LE MOTIF DU PROBLEME - NOM DE LA COMMUNE 1 RUE DE LA COMMUNE - VEHICULE 1';
    	$str2 = 'LE MOTIF DU PROBLEME - NOM DE LA COMMUNE  RUE DE LA COMMUNE - VEHICULE 2';
     
    	$concret = 'Percuté un Arbre - St Martin des Canards 23 Rue du marechal qui se gratte - Ma Tuture';
     
     
    	$regex = '~\s*(?<motif>(\w|\s)+)\s*-\s{1,}(?<commune>(\w|\s)+)\s(?<numero>\d+)?\s(?<voie>(\w|\s)+)\s{1,}-\s*(?<vehicule>(\w|\s)+)\s*~';
     
    	if( preg_match($regex, $concret, $matches) )
    	{
    		echo "Adresse : {$matches['numero']} {$matches['voie']} {$matches['commune']}<br />";
    	}
     
    	if( preg_match($regex, $str2, $matches) )
    	{
    		echo "Adresse : {$matches['voie']} {$matches['commune']}<br />";
    	}
    Les espaces ont intérêt à être aux bons endroits...

  6. #6
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Oui, les espaces sont respectés, c'est généré par une machine de manière automatique.

    Ça fonctionne parfaitement !

    Je ne savais pas que l'on pouvait utiliser : $matches['numero'] au lieu de $matches[3] !

    Merci !

    ZiP

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Tu peux à partir du moment ou tu utilises des sous masques nommés, c'est quand même beaucoup plus clair de cette façon.

  8. #8
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour Benjamin,

    Oui!

    Il faut que j'ameliore car parfois, j'ai une adresse qui comprend un numéro de la forme : "19/2".

    Je vais essayer de trouver par moi même ce soir.

    Cordialement,
    ZiP

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    c'est vraiment important ? d’où viennent les données ?

  10. #10
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Change les sous patterns \w par [a-zA-Z0-9/\-_] pour être plus permissif.

  11. #11
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    En fait, je l'ai modifiée comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ~(?<motif>(.*))\s-\s(?<commune>(.*))\s(?<numero>(\d+\w?))?\s(?<voie>(.*))\s-\s(?<vehicule>(.*))~
    Ensuite, j'ai voulu ajouter le "-" et le "/" pour le numéro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ~(?<motif>(.*))\s-\s(?<commune>(.*))\s(?<numero>(\d+\w?\-?/?))?\s(?<voie>(.*))\s-\s(?<vehicule>(.*))~
    Mais là, ça n'est pas pris en compte...

    Merci pour votre aide,
    ZiP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EXP] Evaluation dans une expression régulière
    Par SergentHeinz dans le forum Langage
    Réponses: 7
    Dernier message: 10/11/2005, 18h17
  2. Une expression réguliére
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/09/2005, 20h14
  3. Réponses: 6
    Dernier message: 17/08/2005, 12h38
  4. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 10h54
  5. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo