Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2011, 18h57   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
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 :
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];	
	}
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 19h04   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 19h11   #3
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
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.
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 19h12   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 #
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 19h35   #5
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
Ceci fonctionne sans caractères accentués.

Code :
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 :
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.
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 20h43   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
je vois pas ce que tu comprends pas dans : après le dernier # ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 09h35   #7
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
Je viens d'essayer cette version, elle ne fonctionne pas.
Code :
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 :
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];	
	}
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 10h07   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par pixworld2 Voir le message
Je viens d'essayer cette version, elle ne fonctionne pas.
Code :
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 :
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 :
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);
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 15h33   #9
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
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 :
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.
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 15h38   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
t'as quelle version de PHP ? sous quel OS ? et quelle version de pcre (PCRE_VERSION)
chez moi ca marche sans soucis
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 15h46   #11
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
Voici les éléments pour le serveur de tests :

Citation:
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 :
Citation:
PHP Version 4.3.8
Linux

PCRE (Perl Compatible Regular Expressions) Support enabled
PCRE Library Version 4.5 01-December-2003
Merci.
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 15h53   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
ca va être tendu, essaye en rajoutant le setlocale alors
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 16h35   #13
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
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 :
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];	
}
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 16h43   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
faut pas mettre l'option u dans ce cas la

Code :
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'];	
}
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 11h35   #15
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
bonjour,
cette solution ne fonctionne guère plus avec le é, le ï.
je continue mes recherches et essais.
Merci.
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 13h07   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 12h53   #17
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
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.
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 13h42   #18
Invité de passage
 
Inscription : décembre 2010
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 24
Points : 1
Points : 1
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 :
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.
pixworld2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h51.


 
 
 
 
Partenaires

Hébergement Web