как я могу сопоставить эти регулярные выражения? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть URL, хранящийся в базе данных. По заданному URL-адресу я должен получить данные из базы данных, но я не уверен, как определить фактический URL-адрес. Это сбивает с толку, когда URL-адрес пользователя является динамическим c, как текст или число. пример:

/user                   should match the url       /user
/user/1                 should match the url       /user/{id}
/user/name/johndoe      should match the url       /user/name/{name}
/user/1/johndoe         should match the url       /user/{id}/{name}

Я пробовал это, он работает для / user / 1, то есть с целыми числами, но я не могу заставить его работать со строкой. Нет способа идентифицировать строковые параметры. Или в mysql есть обходной путь.

MOTO: Извлечение содержимого из базы данных, где заданная строка URL-адреса соответствует столбцу URL-адреса. Примечание: {id}, {name}, {type} являются динамическими c значениями.

Контроллер:

$sanitizedUrl = preg_replace('/\/*\d{1,}/','/{id}', '/user/name/1');
UrlContent::where('url', $sanitizedUrl)->first()->content;

Этот код может работать только с URL-адреса, которые имеют только цифры. Пример: / user / 12 / type / 12 заменяется на / user / {id} / type / {id}

База данных: url_contents

|     url                |  content    |
-----------------------------------------------------------
| /user/name/{id}        | matches if url is /user/name/1 |
| /user/{id}/{name}      | if url is /user/1/john         |
| /user/{type}/{name}    | if url i /user/{type}/{name}   |  

1 Ответ

0 голосов
/ 06 марта 2020

Вы должны сделать это другим способом:

function getUrlContent($url)
{
    $replacements = [
        '{id}' => '\d+',
        '{name}' => '\w+',
    ];

    $urlContents = UrlContent::all();
    foreach ($urlContents as $urlContent) {
        if (preg_match('~' . strtr($urlContent->url, $replacements) . '~', $url)) {
            return $urlContent->content;
        }
    }

    return null;
}

$url = '/user/1/johndoe';

var_dump(getUrlContent($url));

Также вам может понадобиться кэшировать все встроенные регулярные выражения на некоторое время, чтобы уменьшить mysql накладные расходы на передачу туда и обратно. Если таблица url_contents значительно увеличивается, возможно, вам придется добавить еще один столбец, который будет содержать само регулярное выражение:

+-----------------+----------------+------------+
|       url       |    url_regex   |   content  |
+-----------------+----------------+------------+
| /user/name/{id} | /user/name/\d+ |  ......... |
+-----------------+----------------+------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...