PHP регулярное выражение с границами слова

1

Поэтому я пытаюсь написать функцию, которая вытаскивает направление из названия улицы, если оно существует в имени.

Например, улица 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
    ];
}

Как я могу сделать регулярное выражение для этого, чтобы он работал правильно и игнорировал апостроф как границу слова?

РЕДАКТИРОВАТЬ

Добавлено мое исправление ниже :)

  • 0
    удачи с этим. рассмотрим что-то вроде North Road или West Boulevard , названное в честь миссис Норт и мистер Вест
  • 0
    Я предполагаю, что вы, вероятно, хотите искать разделитель пробелов ( \s ), а не разрыв слова ( \b )? Тем не менее, я думаю, что у вас есть большая проблема в том, что ваша предпосылка извлечения «Севера», «Юга», «Востока» и «Запада» приведет к ложным срабатываниям, даже если вы просто примете слово само по себе. Я знаю места под названием "Уэст-Энд" и "Норт-Энд" и т. Д., И дороги, ведущие к ним, называемые "Уэст-Энд-Роуд". Вы не можете взять «Запад» из этого, не разрушив его значение.
Показать ещё 4 комментария
Теги:

1 ответ

1
Лучший ответ

Я разобрался в этом, все работает отлично, даже для названий улиц, которые начинаются с направления:

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] =>
)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню