Preg_split et expression régulière
Résolu
Southstyle
Messages postés
46
Statut
Membre
-
Southstyle Messages postés 46 Statut Membre -
Southstyle Messages postés 46 Statut Membre -
Bonjour,
Quelle est la ligne à écrire pour diviser une chaine selon plusieurs critères ?
Mes critères sont les suivants : il faut retrouver les noms et prénoms d'une personne par rapport à une autre. Ces deux personnes peuvent être séparée par et, +, & ou parfois /
Exemples :
$personnes = Nom1 Prénom1 et Nom2 Prénom2
ou
$personnes = Nom1 Prénom1 / Nom2 Prénom2
ou
$personnes = Nom1 Prénom1 + Nom2 Prénom2
ou
$personnes = Nom1 Prénom1 & Nom2 Prénom2
Dans tous les cas, je dois retrouver
$var[0] = Nom1 Prénom1
$var[1] = Nom2 Prénom2
Quel est le pattern à écrire ??
Merci pour votre précieuse aide !
Raph
Quelle est la ligne à écrire pour diviser une chaine selon plusieurs critères ?
Mes critères sont les suivants : il faut retrouver les noms et prénoms d'une personne par rapport à une autre. Ces deux personnes peuvent être séparée par et, +, & ou parfois /
Exemples :
$personnes = Nom1 Prénom1 et Nom2 Prénom2
ou
$personnes = Nom1 Prénom1 / Nom2 Prénom2
ou
$personnes = Nom1 Prénom1 + Nom2 Prénom2
ou
$personnes = Nom1 Prénom1 & Nom2 Prénom2
$var = preg_split($pattern,$personnes)
Dans tous les cas, je dois retrouver
$var[0] = Nom1 Prénom1
$var[1] = Nom2 Prénom2
Quel est le pattern à écrire ??
Merci pour votre précieuse aide !
Raph
3 réponses
-
Normalement ceci fait l'affaire:
$pattern = '/\s(et|\/|\+|&)\s/'; $var = preg_split($pattern, $personnes, -1, PREG_SPLIT_NO_EMPTY);
\s permet de sélectionner tous les caractères vide, donc les espaces, après (et|\/|\+|&) capture soit et, /, + ou &.
Sinon avec ce pattern:'/\s+et\s+|\s*[\/|\+|&]\s*/'
il faut obligatoirement un espace avant et après le et mais c'est pas obligatoire autours des autres, et de plus ça va supprimé les espaces en trop.-
à mon sens, il faut exiger les espaces autour du "et", car sinon des noms ou prénoms comme "Colette" vont mettre le boxon ;-) - rajouter le quantificateur en faisant
\s+
est une bonne idée- Avec les deux patterns que j'ai mis, il est impossible d'avoir des problèmes avec un prénom/nom qui contient un et vu que dans les deux cas il faut obligatoirement un espace avant et après, mais le second pattern est un peu plus poussé, vu qu'il va vérifier si il y a au moins un espace avant et après le et, mais aussi supprimé ceux en trop. Et les espaces ne sont pas obligatoire pour /, + et &, donc il peux y avoir 0 comme 100 espaces, peut importe les variables seront bien coupé, perso je mettrai un trim sur $personnes, avant de faire la fonction preg_split, pour être certain de n'avoir aucun espace, avant et après les noms.
-
au temps pour moi, effectivement, tes deux expressions exigent des espaces de part et d'autre de "et"
sur les espaces avant et après la variable$personnes
, tu as aussi raison : faire un trim en plus serait nécessaire si on choisit d'utiliser preg_split, car il ne donne de contrôle que sur les séparateurs
en revanche, en utilisant preg_match, on peut ne capturer que ce qui est souhaité, par exemple, avec un pattern comme celui-là :'/^\s*(.*?)\s*(\set\s|[+&\/])\s*(.*?)\s*$/'
et on s'économise des trim à gauche et à droite en obtenant directement les données en positions de capture 1 et 3.
autre remarque, sauf erreur, dans la classe définie entre les crochets, il n'est pas nécessaire d'échapper les caractères spéciaux (+
,*
,.
, etc.) car ils sont compris littéralement. Là j'ai seulement échappé/
car c'est le délimiteur de la regexp.
Dal
-
-
Salut Southstyle,
$var = preg_split("/\\set\\s|\\s*[\\/+&]+\\s*/", "Nom1 Prénom1 +Nom2 Prénom2");
va matcher les lignes avec "et" et deux espaces de part et d'autre
ou
les lignes avec les symboles / + ou &, avec ou sans espaces de part et d'autre
Dal -
Alors c'est parfait comme ça !!
$pattern = '/\s(et|\/|\+|&)\s/';
$var = preg_split($pattern, $personnes, -1, PREG_SPLIT_NO_EMPTY);
J'obtiens ce que je veux, peu importe le séparateur.
Pour les détails de la discussion quant à échapper ou non les caractères spéciaux ou trimer ou non, je vous laisse décider :-)
En tout cas tel quel ça fonctionne et c'est génial.
Merci @ZeNairolf et @[Dal] pour votre précieuse aide.
Salutations !