Ответ 1
До сих пор я использовал этот Regular expression
для приведенных мной примеров, и он получает идентификатор в первой группе:
http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?
У кого-то есть регулярное выражение, которое получает ссылку на видео Youtube (не внедренный объект) из (почти) всех возможных способов связи с Youtube?
Я думаю, что это довольно распространенная проблема, и я уверен, что есть много способов связать это.
Отправной точкой будет:
До сих пор я использовал этот Regular expression
для приведенных мной примеров, и он получает идентификатор в первой группе:
http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?
Вы можете использовать это выражение ниже.
(?:https?:\/\/)?(?:www\.)?youtu\.?be(?:\.com)?\/?.*(?:watch|embed)?(?:.*v=|v\/|\/)([\w\-_]+)\&?
Я использую его, и он охватывает наиболее используемые URL-адреса. Я продолжу обновлять его на This Gist. Вы можете протестировать его в этом инструменте.
Я улучшил ссылки, выложенные выше, с другом для script, который я написал для IRC, чтобы вообще распознать ссылки без http. Он работал над всеми стресс-тестами, которые я получил до сих пор, включая искаженный текст с едва узнаваемыми URL-адресами YouTube, поэтому вот оно:
~(?:https?://)?(?:www\.)?youtu(?:be\.com/watch\?(?:.*?&(?:amp;)?)?v=|\.be/)([\w\-]+)(?:&(?:amp;)?[\w\?=]*)?~
Я тестирую все регулярные выражения, которые показаны здесь, и никто не может охватывать все типы URL-адресов, которые использовал мой клиент.
Я построил это в значительной степени через пробную версию и ошибку, но, похоже, работает со всеми шаблонами, которые опубликовал Poppy Deejay.
"(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/)([a-zA-Z0-9_-]{11})+"
Может быть, это помогает кому-то, кто находится в подобной ситуации, которую я имел сегодня;)
Это будет самый длинный RegEx в мире, если вам удастся охватить все форматы ссылок, но вот один из них, чтобы вы начали, который будет охватывать первые пару форматов ссылок:
http://(www\.)?youtube\.com/watch\?.*v=([a-zA-Z0-9]+).*
Вторая группа будет соответствовать идентификатору видео, если вам нужно это сделать.
В последнее время у меня возникают проблемы с URL-адресами atttribution_link, поэтому я попытался создать собственное регулярное выражение, которое тоже работает для них.
Вот моя строка регулярного выражения:
(https?://)?(www\\.)?(yotu\\.be/|youtube\\.com/)?((.+/)?(watch(\\?v=|.+&v=))?(v=)?)([\\w_-]{11})(&.+)?
и вот некоторые тестовые примеры, которые я пробовал:
http://www.youtube.com/watch?v=iwGFalTRHDA
https://www.youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related
http://youtu.be/iwGFalTRHDA
http://www.youtube.com/embed/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/embed/watch?v=iwGFalTRHDA
http://www.youtube.com/embed/v=iwGFalTRHDA
http://www.youtube.com/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA
www.youtube.com/watch?v=iwGFalTRHDA
www.youtu.be/iwGFalTRHDA
youtu.be/iwGFalTRHDA
youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch/iwGFalTRHDA
http://www.youtube.com/v/iwGFalTRHDA
http://www.youtube.com/v/i_GFalTRHDA
http://www.youtube.com/watch?v=i-GFalTRHDA&feature=related
http://www.youtube.com/attribution_link?u=/watch?v=aGmiw_rrNxk&feature=share&a=9QlmP1yvjcllp0h3l0NwuA
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&u=/watch?v=qYr8opTPSaQ&feature=em-uploademail
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&feature=em-uploademail&u=/watch?v=qYr8opTPSaQ
Также не забудьте проверить строку, которую вы получаете для своего URL-адреса видео, иногда он может получать процентные символы. Если да, просто сделайте это
url = [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
и он должен исправить его.
Помните также, что индекс ключа youtube теперь имеет индекс 9.
NSRange youtubeKey = [result rangeAtIndex:9]; //the youtube key
NSString * strKey = [url substringWithRange:youtubeKey] ;
Piggy, поддерживающий Fanmade, охватывает следующие ссылки, включая кодировку url_links, закодированную url:
(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/|watch\%3Fv\%3D)([a-zA-Z0-9_-]{11})+
https://www.youtube.com/attribution_link?a=tolCzpA7CrY&u=%2Fwatch%3Fv%3DMoBL33GT9S8%26feature%3Dshare
https://www.youtube.com/watch?v=MoBL33GT9S8&feature=share
http://www.youtube.com/watch?v=iwGFalTRHDA
https://www.youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related
http://youtu.be/iwGFalTRHDA
http://www.youtube.com/embed/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/embed/watch?v=iwGFalTRHDA
http://www.youtube.com/embed/v=iwGFalTRHDA
http://www.youtube.com/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA
www.youtube.com/watch?v=iwGFalTRHDA
www.youtu.be/iwGFalTRHDA
youtu.be/iwGFalTRHDA
youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch/iwGFalTRHDA
http://www.youtube.com/v/iwGFalTRHDA
http://www.youtube.com/v/i_GFalTRHDA
http://www.youtube.com/watch?v=i-GFalTRHDA&feature=related
http://www.youtube.com/attribution_link?u=/watch?v=aGmiw_rrNxk&feature=share&a=9QlmP1yvjcllp0h3l0NwuA
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&u=/watch?v=qYr8opTPSaQ&feature=em-uploademail
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&feature=em-uploademail&u=/watch?v=qYr8opTPSaQ
Я работаю с такими ссылками:
http://www.youtube.com/v/M-faNJWc9T0?fs=1&rel=0
И здесь regEx, который я использую, чтобы получить ID от него:
"(.+?)(\/v/)([a-zA-Z0-9_-]{11})+"
Это итерация по существующим ответам и более эффективная обработка краевых случаев. (например http://thisisnotyoutu.be/thing)
/(?:https?:\/\/|www\.|m\.|^)youtu(?:be\.com\/watch\?(?:.*?&(?:amp;)?)?v=|\.be\/)([\w\-]+)(?:&(?:amp;)?[\w\?=]*)?/
вот полное решение для получения идентификатора видео youtube для java или android, я не нашел никакой ссылки, которая не работает с этой функцией.
public static String getValidYoutubeVideoId(String youtubeUrl)
{
if(youtubeUrl == null || youtubeUrl.trim().contentEquals(""))
{
return "";
}
youtubeUrl = youtubeUrl.trim();
String validYoutubeVideoId = "";
String regexPattern = "^(?:https?:\\/\\/)?(?:[0-9A-Z-]+\\.)?(?:youtu\\.be\\/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)(?![?=&+%\\w]*(?:['\"][^<>]*>|<\\/a>))[?=&+%\\w]*";
Pattern regexCompiled = Pattern.compile(regexPattern, Pattern.CASE_INSENSITIVE);
Matcher regexMatcher = regexCompiled.matcher(youtubeUrl);
if(regexMatcher.find())
{
try
{
validYoutubeVideoId = regexMatcher.group(1);
}
catch(Exception ex)
{
}
}
return validYoutubeVideoId;
}
Это регулярное выражение решает мою проблему, я могу получить ссылку на youtube с помощью просмотра, вставки или общей ссылки
(?:http(?:s)?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'<> #]+)
Здесь вы можете проверить https://regex101.com/r/Kvk0nB/1
Это мой ответ для использования в Scala. Это полезно для извлечения 11 цифр из URL-адреса Youtube.
"Https://? (: [0-9a-Za-Z-] +?.)? (? Www.youtube.com/| youtu.be\S * [^\w-\s]) ( [\ w -] {11}) (? = [^\w-] | $) (?! [? = & +%\w] (?: [\ '"] [^ <>]> |) ) [? = & +%\w-] *"
def getVideoLinkWR: UserDefinedFunction = udf(f = (videoLink: String) => {
val youtubeRgx = """https?://(?:[0-9a-zA-Z-]+\.)?(?:youtu\.be/|youtube\.com\S*[^\w\-\s])([\w \-]{11})(?=[^\w\-]|$)(?![?=&+%\w]*(?:[\'"][^<>]*>|</a>))[?=&+%\w-./]*""".r
videoLink match {
case youtubeRgx(a) => s"$a".toString
case _ => videoLink.toString
}
}