带有单词边界的PHP正则表达式


PHP regex with word boundaries

因此,我试图编写一个函数,如果街道名称中存在街道名称,则该函数可以提取街道名称的方向。

例如,街道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] =>
)