2016-02-16 16 views
5

Per favore, fammi sapere come ottenere l'ID di YouTube senza passare all'espressione regolare?Estrai l'ID YouTube con o senza RegEx

Utilizzando sopra metodo seguente URL, non ha funzionato

http://www.youtube.com/e/dQw4w9WgXcQ

http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ

public static String extractYTId(String youtubeUrl) { 
    String video_id = ""; 

    try { 
     if(youtubeUrl != null && youtubeUrl.trim().length() > 0 && youtubeUrl.startsWith("http")) { 
      String expression = "^.*((youtu.be" + "\\/)" + "|(v\\/)|(\\/u\\/w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*"; // var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; 
      //String expression = "^.*(?:youtu.be\\/|v\\/|e\\/|u\\/\\w+\\/|embed\\/|v=)([^#\\&\\?]*).*"; 
      CharSequence input = youtubeUrl; 
      Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE); 
      Matcher matcher = pattern.matcher(input); 
      if(matcher.matches()) { 
       String groupIndex1 = matcher.group(7); 
       if(groupIndex1 != null && groupIndex1.length() == 11) 
        video_id = groupIndex1; 
      } 
     } 
    } catch(Exception e) { 
     Log.e("YoutubeActivity", "extractYTId " + e.getMessage()); 
    } 

    return video_id; 
} 

Altri link lavoro bene

012.351.641.061.

http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0

http://www.youtube.com/embed/0zM3nApSvMg?rel=0

http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index

http://www.youtube.com/watch?v=0zM3nApSvMg

http://youtu.be/0zM3nApSvMg

http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s

http://youtu.be/dQw4w9WgXcQ

http://www.youtube.com/embed/dQw4w9WgXcQ

http://www.youtube.com/v/dQw4w9WgXcQ

http://www.youtube.com/watch?v=dQw4w9WgXcQ

http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0

risposta

1

tua espressione regolare è stato progettato per il dominio youtu.be, ovviamente non funziona con youtube.com uno.

  1. Construct java.net.URL (https://docs.oracle.com/javase/7/docs/api/java/net/URL.html) dalla stringa URL
  2. Usa URL#getQuery() per ottenere la parte di query
  3. Controllare Parse a URI String into Name-Value Collection per un modo di decodificare parte query in una mappa nome-valore, e ottenere valore per nome 'v'
  4. Se non è presente alcuna parte "query" (come in http://www.youtube.com/e/dQw4w9WgXcQ), utilizzare URL # getPath() (che fornirà /e/dQw4w9WgXcQ) e analizzare il proprio ID video da esso, e. g., saltando i primi 3 simboli: url.getPath(). sottostringa (3)

Aggiornamento. Perché non regex? Perché il parser di URL JDK standard è molto più robusto. Viene testato dall'intera comunità Java, mentre la ruota reinventata basata su RegExp viene testata solo dal proprio codice.

+0

Questa non è una risposta per la domanda. –

+0

Ha chiesto un modo per ottenere l'id del video dalla stringa (con o senza regex), ne ho suggerito uno. Perché non pensi che questa sia una risposta? –

+0

ti piace la tranquillità del codice per questo – Piraba

4

È possibile utilizzare seguente RegEx

^(?:(?:https?:\/\/)?(?:www\.)?)?(youtube(?:-nocookie)?\.com|youtu\.be)\/.*?(?:embed|e|v|watch\?.*?v=)?\/?([a-z0-9]+)

RegEx Breakup:

  1. ^: Inizio della linea anchor
  2. (?:(?:https?:\/\/)?(?:www\.)?)?:
    • (?:https?:\/\/)?: Trova http:// o https:// facoltativamente
    • (?:www\.)?)?: Trova www. zero o una volta
  3. (youtube(?:-nocookie)?\.com|youtu\.be)\/: corrispondere sia
    • youtube.com o youtube-nocookie.com o youtu.be seguita da /
  4. .*?: partita pigra. Abbina fino a quando il modello successivo soddisfa.
  5. (?:embed|e|v|watch\?.*?v=)?\/?:
    • (?:embed|e|v|watch\?.*?v=)?: Partita embed o e o v o da watch? a v= o niente
    • \/?: Partita / zero o una volta
  6. ([a-z0-9]+): corrispondere uno o più caratteri alfanumerici e aggiungilo nel gruppo catturato.

Live Demo Utilizzando JavaScript

var regex = /^(?:(?:https?:\/\/)?(?:www\.)?)?(youtube(?:-nocookie)?\.com|youtu\.be)\/.*?(?:embed|e|v|watch\?.*?v=)?\/?([a-z0-9]+)/i; 
 

 
// An array of all the youtube URLs 
 
var youtubeLinks = [ 
 
    'http://www.youtube.com/e/dQw4w9WgXcQ', 
 
    'http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ', 
 
    'http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0', 
 
    'http://www.youtube.com/embed/0zM3nApSvMg?rel=0', 
 
    'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index', 
 
    'http://www.youtube.com/watch?v=0zM3nApSvMg', 
 
    'http://youtu.be/0zM3nApSvMg', 
 
    'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s', 
 
    'http://youtu.be/dQw4w9WgXcQ', 
 
    'http://www.youtube.com/embed/dQw4w9WgXcQ', 
 
    'http://www.youtube.com/v/dQw4w9WgXcQ', 
 
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ', 
 
    'http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0' 
 
]; 
 

 
// An object to store the results 
 
var youtubeIds = {}; 
 

 
// Iterate over the youtube URLs 
 
youtubeLinks.forEach(function(url) { 
 
    // Get the value of second captured group to extract youtube ID 
 
    var id = "<span class='youtubeId'>" + (url.match(regex) || [0, 0, 'No ID present'])[2] + "</span>"; 
 

 
    // Add the URL and the extracted ID in the result object 
 
    youtubeIds[url] = id; 
 
}); 
 

 
// Log the object in the browser console 
 
console.log(youtubeIds); 
 

 
// To show the result on the page 
 
document.getElementById('output').innerHTML = JSON.stringify(youtubeIds, 0, 4);
.youtubeId { 
 
    color: green; 
 
    font-weight: bold; 
 
}
<pre id="output"></pre>

RegEx Visualization Diagram

+2

Questo metodo non funziona nel mio metodo – Piraba

+0

@Piraba Penso che sia necessario raddoppiare i backslash quando si aggiunge la regex come stringa. – Tushar

+0

Ho aggiunto il backslash 'String expression ="/^ (? :(? Https?: \\/\\ /)? (?: www \\.)?)? (Youtube (?: - nocookie)? \\ .com | youtu \\ essere) \\ /.* (?: embed |.? e | v |?.??? guardare \\ * v =) \\/([a-z0-9] +)/I ";'. Non funziona – Piraba

0

Mi piace usare questa funzione per tutti gli ID video di YouTube. Passo attraverso l'url e restituisco solo l'id. controlla il violino qui sotto.

var ytSrc = function(url){ 
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; 
    var match = url.match(regExp); 
    if (match&&match[7].length==11){ 
     return match[7]; 
    }else{ 
    alert("Url incorrecta"); 
    } 

} 

https://jsfiddle.net/keinchy/tL4thwd7/1/

Problemi correlati