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

PHP & Base de données Discussion :

preg_match avec accents


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut preg_match avec accents
    bonsoir,

    je cherche à séparer un champ MYSQL contenant Nom et prénom.

    J'ai donc le script suivant, mais je ne parviens pas à récupérer le Prénom avec des accentuations.
    [:lower:] - ne me récupère que les prénoms sans accentuation
    [:alpha:] - erreur avec les prénoms accentués

    Le code ci-dessous ne fonctionne pas non plus.

    bloque avec les caractères accentués dans le prénom et après de nombreuses tentatives avec toutes les lettres accentués, rien ne passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $_GET['term']="LALANDE Séverine";
     
     
    if (preg_match("#((?:\b[[:upper:]'\s-]+\b)+)\s+((?:\b[[:upper:]]?[[a-z0-9àáâãäåçèéêëìíîïðòóôõöùúûüýÿ]'\s-]+\b)+)#", $_GET['term'], $n)) {
    	echo $Nom=$n[1];	
    	echo $Prenom=$n[2];	
    	}

  2. #2
    Expert confirmé

    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
    Par défaut
    au lieu de : a-z0-9àáâãäåçèéêëìíîïðòóôõöùúûüýÿ

    c'est \p{Xan}
    et faut rajouter l'option u a ton regex

    mais je trouve ton expression bien compliquer juste pour ca

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut
    bonsoir,

    si ce n'est pas trop demandé, peux-tu m'indiquer ou se place le *u*

    pour l'instant j'ai mis \p{Xan} mais ça ne fonctionne pas.

    Merci.

  4. #4
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par pixworld2 Voir le message
    bonsoir,

    si ce n'est pas trop demandé, peux-tu m'indiquer ou se place le *u*

    pour l'instant j'ai mis \p{Xan} mais ça ne fonctionne pas.

    Merci.
    c'est une option donc après le dernier #

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut
    Ceci fonctionne sans caractères accentués.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (preg_match("#((?:\b[[:upper:]'\s-]+\b)+)\s+((?:\b[[:upper:]][[:alpha:]'\s-]+\b)+)#",$_GET['term'],$n)) {
    	echo $Nom=$n[1];	
    	echo $Prenom=$n[2];	
    	}
    Ou dois-je placer le u, est-ce avec un slash ou un anti-slash, j'ai essayé différente position rien ne fonctionne.
    A noter que l'exemple ci-dessous trouvé sur le forum fonctionne sur mon serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function autoriser_caractere_avec_accent($arg_str)
    {
    	if(!setlocale(LC_ALL,array('fra','FR','fr_FR','fr_FR@euro','fr_FR.UTF8', 'fr.UTF8', 'fr_FR.UTF-8', 'fr.UTF-8'))) error_log('set_local failed');
    	if(preg_match('/[^[:alpha:]]/u',$arg_str)) return false;
     	return true;
    }
     
    if(autoriser_caractere_avec_accent('marcel')) echo ' marcel accepté ';
    else echo ' marcel refusé ';
    echo '-';
    if(autoriser_caractere_avec_accent('rené')) echo ' rené accepté ';
    else echo ' rené refusé ';
    Merci d'avance.

  6. #6
    Expert confirmé

    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
    Par défaut
    je vois pas ce que tu comprends pas dans : après le dernier # ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut
    Je viens d'essayer cette version, elle ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (preg_match("#((?:\b[[:upper:]'\s-]+\b)+)\s+((?:\b[[:upper:]][[:alpha:]'\s-]+\b)+)#u",$_GET['term'],$n)) {
    	echo $Nom=$n[1];	
    	echo $Prenom=$n[2];	
    	}
    J'ai également essayé, sans résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $_GET['term']="LALANDE Séverine";
     
     
    if (preg_match("#((?:\b[[:upper:]'\s-]+\b)+)\s+((?:\b[[:upper:]][[\p{Xan}]'\s-]+\b)+)#u",$_GET['term'],$n)) {
    	echo $Nom=$n[1];	
    	echo $Prenom=$n[2];	
    	}

  8. #8
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par pixworld2 Voir le message
    Je viens d'essayer cette version, elle ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (preg_match("#((?:\b[[:upper:]'\s-]+\b)+)\s+((?:\b[[:upper:]][[:alpha:]'\s-]+\b)+)#u",$_GET['term'],$n)) {
    	echo $Nom=$n[1];	
    	echo $Prenom=$n[2];	
    	}
    J'ai également essayé, sans résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $_GET['term']="LALANDE Séverine";
     
     
    if (preg_match("#((?:\b[[:upper:]'\s-]+\b)+)\s+((?:\b[[:upper:]][[\p{Xan}]'\s-]+\b)+)#u",$_GET['term'],$n)) {
    	echo $Nom=$n[1];	
    	echo $Prenom=$n[2];	
    	}

    comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $str = 'LALANDÉ Séverine';
    preg_match('/(?P<lastname>\b[\p{Lu}\x20\x27\x2D]+\b)\x20+(?P<firstname>\b\p{Lu}[\p{Ll}\x20\x2C\x2D]+\b)/u', $str, $matches);
    print_r($matches);

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut
    Je suis désolé, mais votre dernier exemple ne fonctionne guère plus avec les accents. Il est fonctionnel sans les accents.

    J'avais trouvé le code suivant qui fonctionne parfaitement hors la gestion des accents, qui permet de détecter le NOM en majuscules composé de plusieurs particules et également les prénoms en noms composés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	/* 1. Les noms, écrits entièrement en majuscules, partie : ((?:\b[[:upper:]'\s-]+\b)+)
          \b : délimiteur de mots (représente un changement d'état entre un caractère qu'on ne trouve pas dans un mot : un signe de ponctuation, un blanc, ... et l'inverse : tout ce qui est une lettre par exemple).
          [[:upper:]'\s-] : constitués de lettres majuscules ([:upper:]), d'apostrophes ('), d'espaces (\s) et de tirets (-)
          Le premier + indique qu'un nom est constitué d'au moins l'un des caractères précédents
          Le deuxième + dénote le fait que le nom peut être constitué de plusieurs mots en majuscules (au moins un).
    	  2. Les prénoms, commençant par une lettre majuscule (on peut rendre ce critère facultatif en ajoutant un ? derrière le deuxième [[:upper:]]) puis entièrement en minuscules : ((?:\b[[:upper:]][[:lower:]'\s-]+\b)+)
          Tout est strictement identique à la partie correspondant aux noms hormis le fait que [[:upper:]] dit que le prénom doit commencer par une majuscule et que [[:lower:]'\s-] fait en sorte que le restant du prénom soit
    	  constitué de minuscules, d'apostrophes, de blancs ou de tirets.*/
     
    preg_match("#((?:\b[[:upper:]'\s-]+\b)+)\s+((?:\b[[:upper:]]?[[:lower:]'\s-]+\b)+)#", $string, $m)
    Je cherche donc l'attribut qui permet d'autoriser les accents dans les prénoms.

  10. #10
    Expert confirmé

    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
    Par défaut
    t'as quelle version de PHP ? sous quel OS ? et quelle version de pcre (PCRE_VERSION)
    chez moi ca marche sans soucis

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut
    Voici les éléments pour le serveur de tests :

    PHP Version 5.2.5-pl1-gentoo
    Linux

    PCRE (Perl Compatible Regular Expressions) Support enabled
    PCRE Library Version 7.3 2007-08-28

    Directive Local Value Master Value
    pcre.backtrack_limit 100000 100000
    pcre.recursion_limit 100000 100000
    Le serveur cible sera le suivant :
    PHP Version 4.3.8
    Linux

    PCRE (Perl Compatible Regular Expressions) Support enabled
    PCRE Library Version 4.5 01-December-2003
    Merci.

  12. #12
    Expert confirmé

    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
    Par défaut
    ca va être tendu, essaye en rajoutant le setlocale alors

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut
    En effet, ça proviendrait d'un problème de config.

    j'ai le code suivant qui permet de récupérer uniquement le NOM, ça bloque toujours pour le prénom.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $str="LALANDE Séverine";
    setlocale(LC_ALL, 'fr');
    $str = iconv('utf-8', 'ISO8859-1', $str);	
     
    if (preg_match("#((?:\b[[:upper:]'\s-]+\b)+)\s+((?:\b[[:upper:]]?[[:alpha:]'\s-]+\b)+)#u", $str, $m) ) {
    	echo $Nom=$m[1];	
    	echo $Prenom=$m[2];	
    }

  14. #14
    Expert confirmé

    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
    Par défaut
    faut pas mettre l'option u dans ce cas la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $str = 'LALANDE Séverine';
    setlocale(LC_ALL, 'fr');
    $str = utf8_decode($str);
     
    $reg = '/(?P<lastname>\b[[:upper:]\x20\x27\x2D]+\b)\x20+(?P<firstname>\b[[:upper:]][[:lower:]\x20\x2C\x2D]+\b)/';
     
    if(preg_match($reg, $str, $matches));
    {
        echo $matches['lastname'];	
        echo $matches['firstname'];	
    }

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut
    bonjour,
    cette solution ne fonctionne guère plus avec le é, le ï.
    je continue mes recherches et essais.
    Merci.

  16. #16
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par pixworld2 Voir le message
    bonjour,
    cette solution ne fonctionne guère plus avec le é, le ï.
    je continue mes recherches et essais.
    Merci.
    avec des anciennes version + des classe POSIX y'a pas trop de miracle
    faudrait recréer les classe en ASCII, ca devrai pas prendre trop de temps

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut
    bonjour,

    est-ce que cela signifie qu'il faut réécrire l'ensemble en utilisant des éléments de type :

    \x80 pour interpréter le é ?

    Merci pour votre réponse.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 24
    Par défaut
    A force de persévérance, on trouve.

    La solution est donc de remplacer [:alpha:] par les codes ASCII.

    Il faut donc les codes code hexadécimal et pour les lettres accentuées qui posaient problème : Le code ASCII étendu ANSI

    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
    	//Separation Nom Prénom	 pour un nom en majuscule et un prénom commençant par une majuscule
    	/* 1. Les noms, écrits entièrement en majuscules, partie : ((?:\b[[:upper:]'\s-]+\b)+)
          \b : délimiteur de mots (représente un changement d'état entre un caractère qu'on ne trouve pas dans un mot : un signe de ponctuation, un blanc, ... et l'inverse : tout ce qui est une lettre par exemple).
          [[:upper:]'\s-] : constitués de lettres majuscules ([:upper:]), d'apostrophes ('), d'espaces (\s) et de tirets (-)
          Le premier + indique qu'un nom est constitué d'au moins l'un des caractères précédents
          Le deuxième + dénote le fait que le nom peut être constitué de plusieurs mots en majuscules (au moins un).
    	  2. Les prénoms, commençant par une lettre majuscule (on peut rendre ce critère facultatif en ajoutant un ? derrière le deuxième [[:upper:]]) puis entièrement en minuscules : ((?:\b[[:upper:]][[:lower:]'\s-]+\b)+)
          Tout est strictement identique à la partie correspondant aux noms hormis le fait que [[:upper:]] dit que le prénom doit commencer par une majuscule et que [[:lower:]'\s-] fait en sorte que le restant du prénom soit
    	  constitué de minuscules, d'apostrophes, de blancs ou de tirets.*/
     
    	function extraire_nom_prenom($string) {
    	//	if (preg_match("/(?P<lastname>\b[\w\x20\x27\x2D]+\b)\x20+(?P<firstname>\b[[:upper:]][\w\x20\x2C\x2D]+\b)/", $string, $m)) {
    		if (preg_match("#((?:\b[[:upper:]'\s-]+\b)+)\s+((?:\b[[:upper:]]?[\x6A\x6B\x6C\x6D\x6E\x6F\x61\x62\x63\x64\x65\x66\x67\x68\x69\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x2D\x82\xE9\xE0\xE7\xE8\xEF'\s-]+\b)+)#", $string, $m)) {
     
    		  $resultat= array("nom"=>$m[1],"prenom"=>$m[2]);
    			$resultat_liste=array($resultat);
    			return $resultat_liste;
    		}
    		return FALSE;
    	}
    echo $resultat_infos['prenom'];
    echo $resultat_infos['nom'];
    Merci pour votre aide.

Discussions similaires

  1. SELECT sur un champ avec accent
    Par Bibicmoi dans le forum Requêtes
    Réponses: 6
    Dernier message: 21/08/2005, 12h20
  2. [SYBASE] Texte avec accents
    Par vsavoir dans le forum Sybase
    Réponses: 6
    Dernier message: 14/02/2005, 16h50
  3. [JavaMail] Pb avec accent dans sujet et corps de l'email
    Par shaun_the_sheep dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 29/10/2004, 12h42
  4. Problème avec accents et CHARACTER SET ISO8859_1
    Par kinda dans le forum InterBase
    Réponses: 13
    Dernier message: 30/10/2003, 15h49
  5. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19

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