web-dev-qa-db-fra.com

Comment analyser une URL YouTube?

Comment puis-je extraire seulement

http://www.youtube.com/watch?v=qdRaf3-OEh4

à partir d'une URL comme

http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main

Je ne m'intéresse qu'au paramètre "v".

3
Hendré

Mise à jour:

Les meilleurs seraient:

 sed 's/^.\+\(\/\ |\&\| \? \) v =\([^\&] * \). */\ 2 /'
 awk 'match ($ 0,/((\/| & | \?) v =) ([^ &] *) /, x) {print x [3]}' 
 grep -Po '( ? <= (\/| & | \?) v =) [^ &] * '
 # Dire correspondance/ou & puis v = 

RFC 3986 déclare:

 URI = scheme ":" hier-part ["?" requête] ["#" fragment] 
 
 requête = * (pchar/"/"/"?") 
 fragment = * (pchar/"/"/"?" ) 
 
 pchar = non réservé/pct-codé/sous-delims/":"/"@" 
 sans réserve = ALPHA/DIGIT/"-"/"."/"_"/"~" 
 sous-delims = "!"/"$"/"&"/"'"/"("/")" 
/"*"/"+"/","/";"/"=" 
… 

Donc, pour être sûr d'utiliser:

 | sed 's/#.*//' | - to remove #fragment part

devant.

C'est à dire.

| sed 's/#.*//' | grep -Po '(?<=(\/|&)v=)[^&]*'

SED (2):

 echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main'\
 | sed 's/^.\+\Wv =\([^\&] * \). */\ 1 /'

Explication:

 
 's 
 /… /…// THIS/WITH THIS /

' substitue/MATCH 0 ou PLUS CHOIX et groupez-les ()/WITH THIS /

+-------------------------- s _s_ubsititute 
 | + -------------------------/START MATCH 
 || + ----/END MATCH 
 || | + -\1 REMPLACER PAR -\1 == Groupe 1. Ou FIRS bas (). 
 || | | + -/Fin de SUBSTITUT 
 S/^.\+\Wv =\([^\&] * \). */\ 1 /'
 +++ - + - + - + - + ----- + - + ------- ^ Correspondance depuis le début de la ligne 
 ++ - + - + - + - + ----- + - + --- ---- Faites correspondre n'importe quel caractère 
 + - + - + - + - + ----- + - + -------\+ plusieurs fois (grep (+/* *? Etc) glouton) 
 + - + - + - + ----- + - + -------\W Caractère autre que le mot 
 + - + - + ----- + - + ------- v = correspond littéralement à "v =" 
 + - + ----- + - + -------\(Démarrer MATCH GROUP 
 + - ---- + - + ------- [^\&] * Faites correspondre n'importe quel caractère MAIS & - autant que possible 
 + - + ------- \) Terminez MATCH GROUP 
 + -------. * Faites correspondre n'importe quoi; * Autant de fois que possible 
 - aka fin de ligne; comme il n’existe pas de 
 
 [abc] correspondrait à un OR b OR c 
 [abc] * correspondrait à un AND/OU b ET/OU c - autant de fois que possible, 
 [^ Abc] correspondrait à tout, MAIS a, b ou c 
 
/\ 1/Remplacez TOUTE correspondance par MATCH GROUP numéro 1. 
 Ce serait - tout ce qui est entre\(et \) - ce qui est autre chose que "&" 
 après la chaîne littérale "v =" - qui à son tour comporte une lettre autre que Word 
 devant. 
 
 Cela signifie également qu’aucune correspondance ne signifie aucune substitution qui ne donne finalement 
 pas de changement. 
 

Résultat: qdRaf3-OEh4

Remarque: Si aucune correspondance , toute la chaîne sera renvoyée.


(RESTER BOUCHE BÉE:

 echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main'\
 | awk 'match ($ 0,/(\ Wv =) ([^ &] *) /, v) {print v [2]}' 

Résultat: qdRaf3-OEh4

Explication:

In Awk match(string, regexp) est une fonction qui recherche la correspondance la plus longue et la plus à gauche de l'expression rationnelle dans la chaîne. Ici, j'ai utilisé une extension fournie avec Gawk. (voir Awk , GAwk ; MAwk etc.) place les correspondances individuelles - c'est-à-dire: ce qui est entre parenthèses - dans un tableau de correspondances.

Le motif est assez semblable à celui de Perl/Grep ci-dessous.

 
 + ------------------------------------------ Construit en fonction 
 | + --------------------------------- Entrée entière (1 $ aurait été classé 1) 
 | | etc. (Utilisation des délimiteurs par défaut "" *) 
 | | 
 | | 
 | | (....) (....) ------------------ Place\Wv = dans un groupe 1 et [^ &] * groupe 2. 
 correspond (0 $,/(\ Wv =) ([^ &] *) /, v) {print v [2]} 
 | | | | 
 | | + - + ---- Utilisez "v" à partir de /, v; v est un nom défini par l'utilisateur 
 | | + ---- 2 spécifie l'index dans v, qui est un groupe de 
 | | ce qui est entre () dans /…/
 | | 
 | + ----------- L’impression est une autre fonction intégrée. 
 + --------------- Nom du groupe que l’on peut utiliser pour l’impression. 
 
 
 

GREP (Utilisation de Perl compatible):

 echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' |\
 grep -Po '(? <=\Wv =) [^ &] *' 

Résultat: qdRaf3-OEh4

Explication:

 
 - P Utiliser la compatibilité Perl 
 - o N'afficher que la correspondance d'impression de l'expression. 
 - Cela signifie: De notre motif, imprimer/retourner uniquement ce à quoi il correspond. 
 Si rien ne correspond; ne renvoie rien. 
 
 + ------- ^ Inverser les maths sur - ne correspond pas (SEULEMENT comme il est PREMIER entre []) 
 | + ---- - & Un caractère "&" littéral 
 || 
 (? <=\Wv =) [^ &] * 
 | | | | || 
 | | | | | + ---- * Gourmand; autant de fois que possible. 
 | | | + - + ----- [] Ordre sauvage/n'importe quel ordre de ce qui est à l'intérieur [] 
 | | + ----------- v = littéral v = 
 | + -------------\W Caractère autre que mot 
 + ----------------- (? <= Ce qui suit devrait être (médiatement) précédé de. 
? = Huh, <= à gauche, = = égal à 
 
 Donc: Matchal "v =" où "v" est précédé d'un non Ensuite, faites correspondre n'importe quel caractère 
: Autant de fois que possible jusqu'à la fin de la ligne ou jusqu'à ce que vous rencontriez un "&". 
 
 Comme vous ne pouvez pas vous en procurer "&" dans une URL entre des paires clé/valeur doit être OK. 
 
14
Runium
echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' | sed -e 's/&.*//' -e 's/.*watch?//'

vous obtiendrez v=qdRaf3-OEh4.

4
evilsoup