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 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| $sources = []; // liste des sources utilisables
$dbSources = [......]// je récupère toutes les sources de la base
// Récupérer les sources dont les séquences d'ID sont bonnes sans se soucier des espacements
$dataSansEspace = sansEspace($data);
foreach ($dbSources as $s) {
if (@strpos($dataSansEspace , sansEspace($s->data)) !== false) $sources[] = $s;
}
// Sélectionner les sources qui correspondent vraiment
foreach ($sources as $k => $s) {
if (preg_match_all(tousEspacesRegex($s->data), $data, $matches)) {
// On a reconnaissance d'une petite chaine sur la chaine EXACTE de données (une ou plusieurs fois), traiter les matches
foreach ($matches[0] as $m) {
if (preg_match(toRegexp($m), $s->data)) {
// la portion de la grande chaine correspond bien, remplacer par la clé de la source avec un 's' pour la retrouver
if ($m[0] == '_') $m = substr($m, 1); // on ne veut pas manger l'info d'espace de l'élément précédent
$data = str_replace($m, '|s'.$k.'|', $data);
}
}
}
}
// On traite la chaine $data modifiée
foreach (explode('|', substr($data , 1, -1)) as $d) {
...
}
function sansEspace($string) {
return str_replace('||', '|', str_replace('_', '', $string));
}
function tousEspacesRegex($string) {
$s = str_replace('|', '\|', str_replace('|', '(_?)|', $string));
return '#'.$s.'#';
}
function toRegexp($string) {
// Il se peut qu'on ait un espace en début de chaine, ce qui se concrétise par |_|123..., donc on enlève le premier | pour retrouver 456_|123...
if (substr($string, 0, 2) == '|_') $string= substr($string, 1);
return '#'.str_replace('_', '(_?)', str_replace('|', '\|', $string)).'#';
} |
Partager