Регулярное выражение Javascript для извлечения идентификаторов видео Youtube

Следующий код используется для получения идентификаторов видео Youtube, чтобы получить уменьшенное изображение.

Какова причина первого регулярного выражения и что именно оно делает? Кажется, он возвращает как минимум два результата. Кроме того, можно ли их совместить?

else if(url.match("youtube.com/")){

    var vid;
    var results;

    //http://www.youtube.com/watch?v=GItD10Joaa0
    results = url.match("[\\?&]v=([^&#]*)");

    vid = ( results === null ) ? url : results[1];

    return "http://img.youtube.com/vi/"+vid+"/2.jpg";
} else if( url.match("youtu.be/") ) {

    var vid;
    var results;

    // http://youtu.be/5uxd-521uus?hd=1
    // results = url.match("[^http://youtu.be/](.*)[^?hd=1]");
    // Corrected
    results = url.match(""^http://youtu.be/(.*)(?=hd=1)");

    //alert(results[0]);
    vid = ( results === null ) ? url : results[0];

    return "http://img.youtube.com/vi/"+vid+"/2.jpg";
}

person James P.    schedule 19.04.2011    source источник


Ответы (4)


"[\\?&]v=([^&#]*)"

объяснил (после преобразования строки JavaScript в регулярное выражение):

[\?&]   # Match a ? or a & (the backslash is unnecessary here!)
v=      # Match the literal text "v="
(       # Capture the following into backreference no. 1:
 [^&#]* # Zero or more characters except & or #
)       # End of capturing group.

Второе регулярное выражение [^http://youtu.be/](.*)[^?hd=1] очень неправильно.

наверное надо читать

"^http://youtu.be/(.*)(?=hd=1)"
person Tim Pietzcker    schedule 19.04.2011
comment
@alex: Конечно, я просто хлопнул себя по лбу и поправил. - person Tim Pietzcker; 19.04.2011
comment
Разве две обратные косые черты не соответствуют буквальной обратной косой черте? Я не знаю, почему это есть в регулярном выражении (я удалил исходный комментарий, потому что SO испортил его: P). Ожидают ли они youtube.com\?v=abc ? Странный. - person alex; 19.04.2011
comment
@alex: я так не думаю - он использует строку, а не объект регулярного выражения для построения регулярного выражения; поэтому обработчик строк сводит две обратные косые черты к одной, а механизм регулярных выражений получает только одну. - person Tim Pietzcker; 19.04.2011
comment
Спасибо за ответы. Как видите, я еще не разобрался с регулярными выражениями. Должна ли обратная косая черта удваиваться, Тим? - person James P.; 19.04.2011
comment
В вашем случае он вообще не нужен. - person Tim Pietzcker; 19.04.2011
comment
Нет, нет: знак вопроса не должен быть экранирован. Это часть предварительного утверждения. Я предлагаю вам просмотреть учебник по регулярным выражениям, чтобы освоить некоторые основы. - person Tim Pietzcker; 19.04.2011

Если вы имеете в виду...

results = url.match("[\\?&]v=([^&#]*)");

Затем он соответствует литералу \, ? или &, за которым следует литерал v=, за которым следует группа захвата, которая захватывает 0 или более любых символов, которые не являются & или #.

person alex    schedule 19.04.2011

Первое регулярное выражение проверяет наличие "?v=GItD10Joaa0", когда URL-адрес имеет вид "youtube.com/", а второе проверяет наличие "www.youtube.com/index?feature=youtu.be", когда URL-адрес " http://www.youtube.com/index?feature=youtu.be"

Таким образом, вы можете просто использовать 1-е регулярное выражение, если хотите получить идентификаторы из 1-го URL-адреса и аналогичным образом :)

person AabinGunz    schedule 19.04.2011

Хорошо, я немного порыбачил и наткнулся на это регулярное выражение. Он должен соответствовать цели, описанной выше.

youtu(?:\.be|be\.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)

From: Регулярное выражение С# для получения идентификатора видео с youtube и vimeo по URL

И: http://forrst.com/posts/Automatic_YouTube_Thumbnails_with_PHP_and_Regex-uta

person James P.    schedule 19.04.2011