在与你的相似的十二个不同的字符串上尝试了这个,它工作得很好:
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;
}
这假设门牌号至少为两位数,并且不超过六位。这也假设邮政编码不是“扩展”形式(例如 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;