Поэтому я пытаюсь написать функцию, которая вытаскивает направление из названия улицы, если оно существует в имени.
Например, улица Burnhamthorpe Rd West
вытащила бы слово " West
Я сделал это со следующим регулярным выражением:
(?:\b(W)\b)|(?:\b(West)\b)
Проблема заключается в том, когда я попал в следующий адрес Brown 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 Line
Array
(
[st_name] => Brown 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] =>
)
North Road
илиWest Boulevard
, названное в честь миссис Норт и мистер Вест\s
), а не разрыв слова (\b
)? Тем не менее, я думаю, что у вас есть большая проблема в том, что ваша предпосылка извлечения «Севера», «Юга», «Востока» и «Запада» приведет к ложным срабатываниям, даже если вы просто примете слово само по себе. Я знаю места под названием "Уэст-Энд" и "Норт-Энд" и т. Д., И дороги, ведущие к ним, называемые "Уэст-Энд-Роуд". Вы не можете взять «Запад» из этого, не разрушив его значение.