因此,我试图编写一个函数,如果街道名称中存在街道名称,则该函数可以提取街道名称的方向。
例如,街道Burnhamthorpe Rd West
将拉出单词West
我用以下正则表达式做到了这一点:
(?:'b(W)'b)|(?:'b(West)'b)
问题是,当我到达以下地址Brown's Line
并使用正则表达式测试South方向时,它会拉出's
(?:'b(S)'b)|(?:'b(South)'b)
我的php看起来如下
private function breakUpStreetNameParts($address)
{
$directions = ["N" => "North", "S" => "South", "E" => "East", "W" => "West"];
$direction = "";
foreach ($directions as $short_dir => $long_dir) {
if (preg_match_all("/(?:'b({$short_dir})'b)|(?:'b($long_dir)'b)/i", $address, $parts)) {
$direction = $parts[0][0];
$patterns = [
"/{$parts[0][0]}/",
"/'s's/"
];
$replacements = [
"",
" "
];
$address = trim(preg_replace($patterns, $replacements, $address));
}
}
return [
"st_name" => $address,
"st_direction" => $direction
];
}
我该如何为此执行正则表达式,使其正确工作,并忽略作为单词边界的撇号?
编辑
添加了我的修复程序如下:)
我整理了一下,以下内容非常适用,即使是以方向开头的街道名称:
private function breakUpStreetNameParts($address)
{
$directions = ["N" => "North", "S" => "South", "E" => "East", "W" => "West"];
$direction = "";
foreach ($directions as $short_dir => $long_dir) {
if (preg_match_all("/(?:(?:'s)({$short_dir})(?:'s|$))|(?:(?:'s)({$long_dir})(?:'s|$))/i", $address, $parts)) {
$direction = $parts[0][0];
$patterns = [
"/{$parts[0][0]}/",
"/'s's/"
];
$replacements = [
"",
" "
];
$address = trim(preg_replace($patterns, $replacements, $address));
}
}
return [
"st_name" => $address,
"st_direction" => $direction
];
}
Street name: Brown's Line
Array
(
[st_name] => Brown's Line
[st_direction] =>
)
Before breakup: Burnhamthorpe Road West
Array
(
[st_name] => Burnhamthorpe Road
[st_direction] => West
)
Before breakup: West Ave
Array
(
[st_name] => West Ave
[st_direction] =>
)