J'ai une variable qui contient les Prénom et le nom des mes utilisateurs, je voudrais isoler ces 2 données en sachant que le nom est toujours en majuscule, comment puis je faire ?
Version imprimable
J'ai une variable qui contient les Prénom et le nom des mes utilisateurs, je voudrais isoler ces 2 données en sachant que le nom est toujours en majuscule, comment puis je faire ?
Une expression régulière et preg_match() pourraient le faire.
Comment utiliserais tu cette fonction, je comprends psa trop la ?
Une méthode "bourrin" :
Si tes chaines sont de la forme DUPONTalbert et stockées dans une variable $var :
Code:
1
2
3
4
5
6
7
8
9
10
11 $nom = ""; for($i=0; $i<strlen($var); $i++){ if(substr($var, $i, 1) == strtoupper(substr($var, $i, 1))) $nom .= substr($var, $i, 1); } $prenom = str_ireplace($nom, "", $var);
on va dire que ma chaine est de type = "Albert DUPONT" ???
Idem en remplacant dans ta boucle $i=0 par $i=1 et fais un trim au préalable pour être plus propre ;)
EDIT :
et à la fin :
Code:
1
2 $prenom = trim(str_ireplace($nom, "", $var));
Et le prénom peut comporter des majuscules d'après ce que je vois ?Citation:
J'ai une variable qui contient les Prénom et le nom des mes utilisateurs, je voudrais isoler ces 2 données en sachant que le nom est toujours en majuscule, comment puis je faire ?
cele me donne une erreur "Fatal error: Call to undefined function subtr()" :
Code:
1
2
3
4
5
6
7
8
9
10
11 <?php $nom = ""; $var = "Albert DUPONT"; for($i=1; $i<strlen($var); $i++){ if(substr($var, $i, 1) == strtoupper(substr($var, $i, 1))){ $nom .= subtr($var, $i, 1); } $prenom = trim(str_ireplace($nom, "", $var)); } ?>
subtr non !
substr oui
merci cela fonctionne pour les personnes ayant un nom "simple", mais ne parche plus des que mes utilisateurs ont un prénom composée "jean Paul" ou un nom composé "De Winter" :?
Tu as des noms composés de minuscules aussi (De Winter) ?
Quelle est l'étendue de tes cas possibles ?
Juste une question:
Entre le nom et le prénom, ya tjs un espace ?
Parceque sinon, là tu peux utiliser une regexp sur le nom (que des majuscules) avec avant un explode sur l'espace. :roll:
mais De Winter serait DE WINTER
et oui j'ai toujours un espace entre le prénom et le nom mais aussi tous ces cas :
Albert DUPONT
Jean Albert DUPONT
Albert DE DUPONT
Albert DA DUPONT
Albert DI DUPONT
Jean-Gerard DUPONT
Si tes noms sont toujours en majuscules alors faire un explode sur l'espace et regarder si les occurences ne contiennent que des majuscules si oui alors concaténer dans l'ordre des indices de ton tableau explode toutes ces occurences pour former ton nom
EDIT :
Code:
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
26 <?php $tab = array("Jean DUPONT", "Jean DI DUPONT"); for($i=0; $i<count($tab); $i++){ $nom = ""; $prenom = ""; $tmp = explode(" ", $tab[$i]); for($j=0; $j<count($tmp); $j++){ if($tmp[$j] == strtoupper($tmp[$j]) $nom .= $tmp[$j]." "; else $prenom .= $tmp[$j]." "; } $nom = rtrim($nom) $prenom = rtrim($prenom) } ?>
voilà (explode + regexp sur les majuscules).
Suis pas un pro des regexp mais un truc dans le genre sur chaque partie :
/^[A-Z]+[A-Z]*$/
Sinon, une autre façon de faire :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 <?php $str = 'Albert DUPONT Jean Albert DUPONT Albert DE DUPONT Albert DA DUPONT Albert DI DUPONT Jean-Gerard DUPONT'; $reg = '/^([A-Z][a-z]+)((?: [A-Z]+)+)$/m'; preg_match_all($reg, $str, $m); print_r($m);
Bonjour s.n.a.f.u,
Tu peux m'expliquer la zone : (?: [A-Z]+) stp
merci
[A-Z]+ signifie une majuscule répétées au moins une fois
le motif (?: ) est une parenthèse non-capturante, pour économiser les perfs
Et mon motif était incomplet, il manquait le dernier bonhomme.
Celui-ci attrape tout le monde :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <?php $str = 'Albert DUPONT Jean Albert DUPONT Albert DE DUPONT Albert DA DUPONT Albert DI DUPONT Jean-Gerard DUPONT Foo DE-BAR snafu FUBAR Jean Charles FOOBAR Francois Xavier DI FOOBAR'; $reg = '/^((?:[A-Z]?[a-z- ]+)+)((?: [A-Z-]+)+)$/m'; preg_match_all($reg, $str, $m); print_r($m);
OUTCHHH, va falloir que je regarde celà de plus près :lol:Citation:
le motif (?: ) est une parenthèse non-capturante, pour économiser les perfs
Merci bien, bonne journée