因此,我正在尝试编写一个函数,该函数将从街道名称中提取出方向(如果该名称中存在该方向)。
例如,街上Burnhamthorpe Rd West
会拉出这个词West
我已经使用以下正则表达式完成了此操作:
(?:\b(W)\b)|(?:\b(West)\b)
问题是当我点击以下地址Brown's Line
并使用正则表达式测试南向时,它拉出了'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] =>
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句