Page 1 sur 1

REGEX avec condition ?

Posté : 07 avr. 2018, 15:15
par blinz
Salut tout le monde voilà j'ai un fichier csv et je souhaite récupérer des données dessus.
Je bloque sur l'exploitation d'un résultat.

En fait le résultat récupérer peut être sous 2 formes à savoir:

Patinoire Valigloo, MARLY le 17/04/2018
ou
Eglise St Julien Le Pauvre, PARIS 05 du 03/09/2017 au 25/03/2018

Le but est de coupé cette chaine chaine en 3
- Le lieux
- La ville
- les Dates.

et je bloque pour la ville:
Car je souhaite récupérer après la virgule jusqu'à le ... ou du....
et je ne vois pas comment écrire la regex.
Actuellement j'ai ceci:
foreach($csv as $ligne){

$manufacturer = (explode(', ', $ligne[2]));
echo $manufacturer[0]; // Lieux


preg_match('# [ A-Z 0-9 ]+ #', $manufacturer[1], $match);
echo trim($match[0]).' <br> ';// Ville

}
Problème pour la ville car ça me renvoi par exemple PRIEST pour un resultat attendu ST PRIEST

Re: REGEX avec condition ?

Posté : 07 avr. 2018, 20:30
par tesmet
Hello, il y a preg_split() qui pourrait être utilisé si le format est toujours comme les 2 présentés en découpant sur la virgule d'une part et sur les mots "de au le" qui sont suivis d'un format de date d'autre part avec une assertion avant (?=...) pour ne pas découper la date elle-même.

<?php

$tests = array(
  'Patinoire Valigloo, MARLY le 17/04/2018',
  'Eglise St Julien Le Pauvre, PARIS 05 du 03/09/2017 au 25/03/2018',
);

foreach($tests as $test) {
  $split = preg_split('#,\s*|\s+(du|au|le)\s+(?=\d+/\d+/\d+)#i', $test);
  if(count($split) == 3) $split[] = $split[2]; // dupliquer la date dans le cas d'une date unique ?
  echo "<pre>$test\n", print_r($split, true), "\n</pre>\n";
}
/*
#                 délimiteur
,\s*              découper la virgule et les possibles blancs qui suivent
|                 ou bien, donc en toute logique après la virgule
\s+(du|au|le)\s+  découper sur l'un des mots "du au le" incluant les blancs avant et après
(?=\d+/\d+/\d+)   et le mot doit être suivi du format de date \d+/\d+/\d+ sans découper cette date (?=...)
#i                fin de l'expression avec le modificateur i pour insensible majuscule/minuscule
*/

affichera
Patinoire Valigloo, MARLY le 17/04/2018
Array
(
[0] => Patinoire Valigloo
[1] => MARLY
[2] => 17/04/2018
[3] => 17/04/2018
)


Eglise St Julien Le Pauvre, PARIS 05 du 03/09/2017 au 25/03/2018
Array
(
[0] => Eglise St Julien Le Pauvre
[1] => PARIS 05
[2] => 03/09/2017
[3] => 25/03/2018
)