Регулярные выражения: Как валидировать URL видео-хостингов (YouTube, Vimeo, Rutube, VK) и запретить вставку ссылок на сторонние ресурсы?
Валидация URL видео-хостингов с помощью регулярных выражений — распространённая задача при разработке форм, CMS и пользовательских редакторов. Ниже разберём подход для четырёх популярных платформ: YouTube, Vimeo, Rutube и VK.
## Принцип работы
Идея проста: составить одно общее регулярное выражение (или набор отдельных), которое разрешает только домены нужных платформ и отклоняет всё остальное.
## Регулярные выражения для каждой платформы
### YouTube
YouTube поддерживает несколько форматов ссылок:
— `https://www.youtube.com/watch?v=VIDEO_ID`
— `https://youtu.be/VIDEO_ID`
— `https://www.youtube.com/embed/VIDEO_ID`
Regex:
^https?://(www.)?(youtube.com/(watch?v=|embed/|v/)|youtu.be/)[w-]{11}(S*)?$
### Vimeo
— `https://vimeo.com/123456789`
— `https://player.vimeo.com/video/123456789`
Regex:
^https?://(www.)?(player.)?vimeo.com/(video/)?d+(/[w-]+)?(?.*)?$
### Rutube
— `https://rutube.ru/video/HASH/`
Regex:
^https?://(www.)?rutube.ru/video/[a-zA-Z0-9]+(/)?$
### VK Видео
— `https://vk.com/video-12345_67890`
— `https://vk.com/video?z=video-12345_67890`
Regex:
^https?://(www.)?vk.com/(video[-d_]+|video?z=video[-d_%]+)$
## Объединённое регулярное выражение
Для удобства можно объединить все паттерны через `|`:
javascript
const videoUrlRegex = /^https?://(www.)?(youtube.com/(watch?v=|embed/)|youtu.be/[w-]{11}|player.vimeo.com/video/d+|vimeo.com/d+|rutube.ru/video/[a-zA-Z0-9]+/|vk.com/(video[-d_]+|video?z=video[-d_%]+))/i;
function isAllowedVideoUrl(url) {
return videoUrlRegex.test(url);
}
## Пример на PHP
php
function isAllowedVideoUrl(string $url): bool {
$pattern = ‘/^https?://(www.)?(youtube.com/(watch?v=|embed/)|youtu.be/[w-]{11}|vimeo.com/d+|player.vimeo.com/video/d+|rutube.ru/video/[a-zA-Z0-9]+/|vk.com/(video[-d_]+|video?z=video[-d_%]+))/i’;
return (bool) preg_match($pattern, $url);
}
## Как запретить сторонние ресурсы
Логика запрета строится на инверсии: если функция `isAllowedVideoUrl()` возвращает `false`, ссылка блокируется. На фронтенде это можно реализовать через обработчик события `input` или `submit`, на бэкенде — через middleware или валидатор формы.
## Важные нюансы
1. **Протокол**: всегда проверяйте наличие `https://` — это защита от XSS через `javascript:` ссылки.
2. **Регистр**: используйте флаг `i` для регистронезависимого сравнения.
3. **Обновляемость**: платформы меняют форматы URL — выносите паттерны в конфиг.
4. **Тестирование**: проверяйте regex на реальных примерах через regex101.com.
Такой подход обеспечивает надёжную белую фильтрацию и не требует сложной логики парсинга URL.
