PHP Regex для URL-адресов IMDB / TMDB - PullRequest
0 голосов
/ 27 мая 2020

Я пишу код, который сравнивает ссылки из imdb и tmdb. Код соответствует ссылке на imdb, а затем преобразует ее для ссылки tmdb, если она была вставлена.

Ссылки выглядят так: https://www.imdb.com/title/tt0848228 https://www.themoviedb.org/movie/24428

Я хочу спросить, верны ли эти регулярные выражения для ссылок на фильмы.

Например,

$imdb_url =  https://www.imdb.com/title/tt0848228

            if (strpos($imdb_url, 'themoviedb.org') == true) {
                preg_match_all('/\\d*-/', $imdb_url, $tmdb_id);

                $tmdb_id        = $tmdb_id[0];
                $tmdb_id        = str_replace('-', '', $tmdb_id);
                $tmdb_id        = $tmdb_id[0];

                $request_url    = amy_movie_provider_build_query_url('tmdb', $tmdb_id, $api_key);
                $the_data       = wp_remote_get($request_url, array(
                    'timeout'     => $timeout,
                ));

                if (!is_wp_error($the_data) && !empty($the_data)) {
                    $movie_data = json_decode($the_data['body'], true);
                    $result     = amy_movie_add_tmdb_movie_data($movie_data);

                    echo $result;
                    exit;
                } else {
                    $result     = esc_html__('Provider TMDB being error!', 'amy-movie-extend');

                    echo $result;
                    exit;
                }

                exit;
            }

И еще для ссылки imdb:

else if (strpos($imdb_url, 'www.imdb.com') == true) {
                preg_match_all('/tt\\d{7}/', $imdb_url, $imdb_id);

                $imdb_id    = $imdb_id[0];
                $imdb_id    = $imdb_id[0];
            }

Я думаю, что это не работает, потому что что-то может быть не так с отсутствующим префиксом / mov ie в ссылке, но я попытался изменить это, и он все еще выявляет ошибку 404.

1 Ответ

0 голосов
/ 27 мая 2020

Почему бы не объединить часть домена с остальной частью URI? Почему один раз пропустить поддомен, а один раз сделать его обязательным?

$sURI= 'whatever';
if( preg_match( '#imdb\\.com/title/tt(\\d{7})#i', $sURI, $aMatch ) ) {
  echo 'IMDb, movie #'. $aMatch[1];
} else
if( preg_match( '#themoviedb.org/movie/(\\d+)($|-)#i', $sURI, $aMatch ) ) {
  echo 'TMDb, movie #'. $aMatch[1];
} else {
  echo 'Unrecognized';
}

Таким образом, не имеет значения, идет ли URI IMDb с www. или нет. Поскольку идентификаторы mov ie имеют фиксированную длину, нам даже не нужно ожидать / заботиться о следующем sla sh. Ваша ошибка заключалась в ожидании sla sh без какой-либо необходимости.

То же самое для TMDb, которое либо заканчивается сразу (но мы хотим довести все цифры до конца, а не только первую), либо за ним следует да sh. i предназначен для действительно искаженных URI по какой-либо причине. Ваша ошибка заключалась в том, чтобы ожидать da sh и сделать цифры совершенно необязательными (когда хотя бы одна должна быть необходима, как в https://www.themoviedb.org/movie/9)

Примечание: использование \\d в строке PHP для регулярного выражения - это правильный путь, поскольку вам сначала нужно иметь дело с контекстом строки - там эффективный backsla sh должен экранироваться самим backsla sh. И только после этого встречается область действия регулярного выражения. \d также работает только потому, что неизвестные escape-последовательности игнорируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...