Я использую это регулярное выражение для проверки 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.
Я ищу обходной путь.
Не разрешать другой ? после первого:
?
^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$
Фактические ? в параметрах запроса должны быть экранированы, поэтому этот подход не должен исключать никаких допустимых URL.
^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?!\S+http:\/\/)(?:\S*)$
Должен сделать свое дело!
Использование отрицательного взгляда перед фактическим соответствием тому, что осталось в строке. :)
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_-]*)/
спасибо
Ruby on Rails 4 жалуется на использование ^ и $ из-за возможной возможности внедрения скрипта. Здесь редактируется, чтобы избежать этого предупреждения, а также принять https
https
/\Ahttps?:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:\S+)?\z/
Если вам нужна только двойная паста, то, возможно, попробуйте этот ReGex (базовый ответ don @ stema):
^http:\/\/(?:www\.)?youtube\.com\/watch\?(?=.*v=\w+)(?:(?:\S(?!.{0,}youtube\.com.{0,}))+)?$
Как насчет
^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:(?:\S(?!http))+)?$
См. Здесь здесь, на Regexr
Я изменил последнюю часть (?:\S+)? на (?:(?:\S(?!http))+)?, что означает, соответствует следующему несимвол пробела (\S), только если за ним не следует http ((?!http))
(?:\S+)?
(?:(?:\S(?!http))+)?
\S
(?!http)