REGEX avec condition ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : REGEX avec condition ?

Re: REGEX avec condition ?

par tesmet » 07 avr. 2018, 20:30

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
)

REGEX avec condition ?

par blinz » 07 avr. 2018, 15:15

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