cr1gger
@cr1gger
Все дороги ведут в Рим — встретимся в Риме!

Требуется оценка и критика регулярного выражения?

Имеются различные виды ссылок на ютуб каналы:
http://www.youtube.com/user/TheJuicyJVEVO
https://www.youtube.com/channel/UC4SusBgD3b1G5cCh_gjA81g
http://www.youtube.com/user/fabrikaband?gl=RU&hl=ru
https://www.youtube.com/channel/UCd2R33j8_ZtNtP2HmXNqAGA/featured
https://www.youtube.com/channel/UCd2R33j8_ZtNtP2HmXNqAGA/videos?a=b&b=c


Написал регулярку чтобы вытаскиывала ID канала на PHP:
function getGetIdChannel($link)
    {
        preg_match('~(channel\/|user\/)(?P<unslash>[\w_-]+)|\/(channel\/|user\/)(?P<slash>[\w_-]+)\/~ui', $link, $matches);

        if (isset($matches['unslash']) && !empty($matches['unslash'])) {
            return $matches['unslash'];
        } elseif (isset($matches['slash']) && !empty($matches['slash'])) {
            return $matches['slash'];
        }
    }

Все работает как бы и находит. Я хотел бы чтобы сказали мне, не слишком ли большое получилось выражение ?
Может есть другие варианты ?

И конечно же 1 вопрос.
Еще имеются такие каналы:
https://www.youtube.com/duranduran
https://www.youtube.com/r3hab
Как в одну регулярку все уместить и еще и третий тип засунуть ?
  • Вопрос задан
  • 83 просмотра
Решения вопроса 2
@IS-Builder
~ PHP-8 & REGEXP - This is a really powerful kit ~
Владислав - критика: шаблон у вас громоздкий и медленный (это видно по количеству итераций [1046 steps]). Более эффективное по скорости решение: ~com/(?:[^/]+/)?\K[^/\s?]+~

UPD: Ответы на вопросы из комментариев:

я там не нашел буквы К и ?:

Если всмотреться, то там не один символ K, а последовательность символов \K, означающая сброс буфера регулярных выражений, или проще говоря - удаление из памяти найденных на данный момент совпадений. Символы ?: вы тоже ошибочно вырвали из контекста - в оригинале они пишутся так: (?:...), и означают они незахватывающую группировку. Её отличие от обычной группировки (...) в том, что она не сохраняет в памяти группу символов, находящихся внутри скобок. Ну и последнее: последовательность символов \s означает символьный класс всех пробельных символов (табуляция, перевод на новую строку, и т.п.).

P.S.: Возможно описанное выше вам покажется сложным для понимания - в таком случае рекомендую к прочтению книгу Джеффри Фридла "Регулярные выражения 3-е издание".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Wanted. Санкт-Петербург
До 450 000 ₽
Wanted. Санкт-Петербург
До 100 000 ₽
Wanted. Санкт-Петербург
До 120 000 ₽