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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
// Expression rationnelle qui permet de récupérer le code postal à partir d'une chaine de caractère
define('CP_PATTERN_RECOGNITION', "#B[ .]*P[ .]*([0-9 ]*)#");
/**
* Extrait le code postal à partir d'une chaine de caractère.
* @param string $cp le code postal brut
*/
function extractCP($cp) {
$result = preg_match(CP_PATTERN_RECOGNITION, $cp, $matches);
// Si c'est bien reconnu comme un code postal
if ($result > 0) {
// On récupère la première expression entre parenthèse, celle qui contient les nombres
$numbersAndSpace = $matches[1];
$length = strlen($numbersAndSpace);
$i = 0;
$cpnumbers = ""; // Cette variable va contenir les nombres du code postal
/*A toi d'adapter un peu ce qui suit, parce que c'est de la bidouille
(pas bien pigé les vraies règles)*/
// On récupère tous les nombres que l'on trouve, mais maximum trois.
while ($i < $length && (strlen($cpnumbers) < 3)) {
if (ctype_digit($numbersAndSpace[$i])) {
$cpnumbers .= $numbersAndSpace[$i];
}
$i++;
}
// On récupère encore les nombres qui restent, mais on s'arrêtent dès qu'on tombe sur un espace.
while ($i < $length && $numbersAndSpace[$i] != ' ') {
$cpnumbers .= $numbersAndSpace[$i];
$i++;
}
// Résultat final
return "BP" . $cpnumbers;
}
else {
// Pas un CP
return "";
}
}
$test_cp_list = array(
'BP 100',
'B P 1 0 0',
'B.P.100CAEN',
'PARISBP70 PARIS',
'LYONBP69 000',
'BP232 06900 PARIS',
'BP232 06 900 PARIS',
'B.P.23 200 75 200',
'B.P.23 06 800',
'BP 23 800 900',
'BP 452 568',
'BP12 45 8002'
);
foreach($test_cp_list as $cp) {
var_dump( $cp . " => " . extractCP($cp));
} |
Partager