Preg_split et expression régulière

Résolu/Fermé
Southstyle Messages postés 46 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 26 mars 2021 - 3 avril 2017 à 17:35
Southstyle Messages postés 46 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 26 mars 2021 - 8 avril 2017 à 11:42
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

$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
A voir également:

3 réponses

Utilisateur anonyme
Modifié le 3 avril 2017 à 18:15
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.
1
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
3 avril 2017 à 18:18
à 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
0
Utilisateur anonyme > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
3 avril 2017 à 21:28
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.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
4 avril 2017 à 12:07
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
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 3 avril 2017 à 18:15
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
0
Southstyle Messages postés 46 Date d'inscription mardi 17 avril 2012 Statut Membre Dernière intervention 26 mars 2021
8 avril 2017 à 11:42
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 !
0