PHP Regex - видео файлы прямые ссылки и ссылки на YouTube - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь создать регулярное выражение, которое должно соответствовать URL-адресам, которые указывают непосредственно на * .mp4 файл или видео YouTube, используя PHP.

Я успешно создал регулярное выражение, которое соответствует только видео YouTube и другому регулярному выражению для сопоставления только с прямым * .mp4 файлом, теперь я хочу объединить их, что в настоящее время не удается.

Требование соответствия заключается в том, что он должен соответствовать URL-адресу с использованием http (s) и / или www и без него. Так, например, следующие ссылки должны быть действительными:

https://www.example.com/files/video.mp4
http://www.example.com/files/video.mp4
https://example.com/files/video.mp4
http://example.com/files/video.mp4
www.example.com/files/video.mp4
www.youtube.com/watch?v=xxxxxx
www.youtu.be/watch?v=xxxxxx

Я использую regex101.com для тестирования и объяснений. В настоящее время некоторые ссылки действительны в соответствии с данным веб-сайтом тестера, а некоторые ссылки неверны, хотя на самом деле они должны быть правильными.

Есть ли кто-нибудь, кто может сказать мне, что не так с моим регулярным выражением ?

(http(s)?:\/\/|(w){3}).*\.((?:mp4)|).*(youtu(be|.be))?(\.com)?\/.+

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Это потому, что вы неправильно используете выражение .*, что означает any character, between 0 and unlimited times.

Вот что вы хотите:

(https?\:\/\/)?(www\.)?(((youtube\.com|youtu\.?be)\/.+)|([\w\/\.]*\.mp4))
0 голосов
/ 23 июня 2018

Как указывает blhsing, это последний слеш, который предотвращает (ошибочно) совпадение шаблона со всеми вашими URL.Проблема в том, что после того, как вы сделаете этот последний слеш необязательным, шаблон будет соответствовать ЛЮБОМ URL, потому что все ваши проверки являются просто необязательными частями после тех подстановочных знаков .*, которые уже совпадают с концом строки.( пример, показывающий эти ложные срабатывания )

Я думаю, вы, возможно, могли бы использовать прогноз с шаблоном, подобным этому :

(?<protocol>https?:\/\/(www\.)?|www\.)(?=.*mp4$|(?:youtu\.?be))(?<url>.*)

После того, как часть протокола вышла из строя, мы «смотрим вперед» с помощью (?=.*mp4$|(?:youtu\.?be), чтобы увидеть либо 1) mp4 в конце строки, либо 2) часть домена выглядит как «youtube | youtu.be».После условного (предпросмотр) мы просто сопоставляем остальную часть шаблона.

0 голосов
/ 23 июня 2018

Почему вы ставите тест mp4 перед тестом доменного имени?Необходимая косая черта \/ и дополнительные символы (.+) в конце - это то, что мешает вашему регулярному выражению сопоставлять любые ссылки mp4.

...