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
| $formatted = [];
$formatted['subject'] = '%1$sil a dit %1$s%1$saie%1$s%1$s %2$s en criant%1$s
%1$sLaurent TOGIER%1$s%2$s%1$s19\%2$s Rue Bréa%1$s%2$s75006%2$sPARIS
Laurent TOGIER%2$s%1$s\%2$s Rue Bréa%1$s%2$s75006%2$sPARIS
Laurent TOGIER%2$s%1$s19\%2$s%1$s%2$s75006%2$sPARIS
Laurent TOGIER%2$s%1$s\%2$s%1$s%2$s75006%2$sPARIS
Laurent TOGIER%2$s%1$s19\%2$s Rue\%2$s Bréa%1$s%2$s75006%2$sPARIS
Laurent TOGIER%2$s%1$s\%2$s\%2$s%1$s%2$s75006%2$sPARIS';
$formatted['pattern'] = '~
# Soit la position contiguë au dernier match, soit le %1$s ouvrant
(?: \G (?!\A) | %1$s %2$s* )
# Pour être sûr de ne pas sortir des guillemets
[^%2$s%1$s]* (?: %1$s%1$s [^%2$s%1$s]* )*
# Ensuite deux possibilités:
(?: # le %1$s de fin, dans ce cas on avance au prochain %1$s (ou à la fin de la chaîne)
%1$s (?: [^%1$s]* (?: %1$s | \z ) )
| # ou le séparateur de champs, dont on capture le caractère précédent dans un lookbehind)
(?<=(.)) %2$s
)
~xu';
$placeholders = [ '"', ';' ];
$pattern = vsprintf($formatted['pattern'], $placeholders);
vsprintf($formatted['subject'], $placeholders);
if ( preg_match_all($pattern, $subject, $matches) ) {
$found = count_chars(implode('', $matches[1]), 1);
$found = array_combine(array_map('chr', array_keys($found)), $found);
print_r($found);
} |
Partager