URL YouTube с регулярным выражением - PullRequest
4 голосов
/ 29 ноября 2011

Я использую это регулярное выражение для проверки URL-адресов YouTube.

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:\S+)?$

отлично работает.

Но у меня есть проблема с этим.

Если пользователь вводит http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports, он работает нормально

Теперь я хочу избежать этого

http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sportshttp://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sportshttp://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports

один и тот же URL вставляется несколько раз (в нашем случае трижды). Для этого регулярного выражения это также допустимый адрес YouTube.

Я ищу обходной путь.

Ответы [ 6 ]

8 голосов
/ 29 ноября 2011

Не разрешать другой ? после первого:

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$

Фактические ? в параметрах запроса должны быть экранированы, поэтому этот подход не должен исключать никаких допустимых URL.

2 голосов
/ 29 ноября 2011
^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?!\S+http:\/\/)(?:\S*)$

Должен сделать свое дело!

Использование отрицательного взгляда перед фактическим соответствием тому, что осталось в строке. :)

1 голос
/ 23 июня 2019

URL-адрес YouTube в основном два типа

http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports

или

https://youtu.be/zcKEjSYJVLs

проверить это в ruby ​​просто

if (youtube_url.include?("youtube.com") || youtube_url.include?("youtu.be"))
   statement
end

если вы хотите проверить с помощью регулярного выражения, используйте это

/^http[s]*:\/\/[www\.]*youtu[.]{1}*be[.com]{4}*\/[watch\?v=]*([a-zA-Z0-9_-]*)/

спасибо

1 голос
/ 10 марта 2014

Ruby on Rails 4 жалуется на использование ^ и $ из-за возможной возможности внедрения скрипта. Здесь редактируется, чтобы избежать этого предупреждения, а также принять https

/\Ahttps?:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:\S+)?\z/
1 голос
/ 29 ноября 2011

Если вам нужна только двойная паста, то, возможно, попробуйте этот ReGex (базовый ответ don @ stema):

^http:\/\/(?:www\.)?youtube\.com\/watch\?(?=.*v=\w+)(?:(?:\S(?!.{0,}youtube\.com‌​.{0,}))+)?$
1 голос
/ 29 ноября 2011

Как насчет

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:(?:\S(?!http))+)?$

См. Здесь здесь, на Regexr

Я изменил последнюю часть (?:\S+)? на (?:(?:\S(?!http))+)?, что означает, соответствует следующему несимвол пробела (\S), только если за ним не следует http ((?!http))

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