あなたのものに似ている12の異なるストリングでこれを試してみました、そしてそれはうまくいきました:
function str_to_address($context) {
$context_parts = array_reverse(explode(" ", $context));
$zipKey = "";
foreach($context_parts as $key=>$str) {
if(strlen($str)===5 && is_numeric($str)) {
$zipKey = $key;
break;
}
}
$context_parts_cleaned = array_slice($context_parts, $zipKey);
$context_parts_normalized = array_reverse($context_parts_cleaned);
$houseNumberKey = "";
foreach($context_parts_normalized as $key=>$str) {
if(strlen($str)>1 && strlen($str)<6 && is_numeric($str)) {
$houseNumberKey = $key;
break;
}
}
$address_parts = array_slice($context_parts_normalized, $houseNumberKey);
$string = implode(' ', $address_parts);
return $string;
}
これは、家番号が2桁以上、6桁以下であることを前提としています。これは、郵便番号が「拡張」形式(12345-6789など)ではないことも前提としています。ただし、これはその形式に合わせて簡単に変更できます(ここでは、のような正規表現が適切なオプションです(\d{5}-\d{4})
。
しかし、ユーザーが入力したデータを解析するために正規表現を使用する...検証がなかったため、ユーザーが何を入力するのかわからないため、ここではお勧めできません。
コンテキストから配列を作成し、zipを取得することから始めて、コードとロジックをウォークスルーします。
// split the context (for example, a sentence) into an array,
// so we can loop through it.
// we reverse the array, as we're going to grab the zip first.
// why? we KNOW the zip is 5 characters long*.
$context_parts = array_reverse(explode(" ", $context));
// we're going to store the array index of the zip code for later use
$zipKey = "";
// foreach iterates over an object given the params,
// in this case it's like doing...
// for each value of $context_parts ($str), and each index ($key)
foreach($context_parts as $key=>$str) {
// if $str is 5 chars long, and numeric...
// an incredibly lazy check for a zip code...
if(strlen($str)===5 && is_numeric($str)) {
$zipKey = $key;
// we have what we want, so we can leave the loop with break
break;
}
}
家番号を取得するためのより良いオブジェクトがあるように、いくつかの整理を行います
// remove junk from $context_array, since we don't
// need stuff after the zip
$context_parts_cleaned = array_slice($context_parts, $zipKey);
// since the house number comes first, let's go back to the start
$context_parts_normalized = array_reverse($context_parts_cleaned);
次に、郵便番号を使用したのと同じ基本ロジックを使用して、家番号を取得しましょう。
$houseNumberKey = "";
foreach($context_parts_normalized as $key=>$str) {
if(strlen($str)>1 && strlen($str)<6 && is_numeric($str)) {
$houseNumberKey = $key;
break;
}
}
// we probably have the parts we for the address.
// let's do some more cleaning
$address_parts = array_slice($context_parts_normalized, $houseNumberKey);
// and build the string again, from the address
$string = implode(' ', $address_parts);
// and return the string
return $string;