In questo snippet vediamo come ottenere l’ID di un video YouTube, che ci potrà servire per creare un embed, per storarlo in un database, o semplicemente per verificare che l’URL YouTube inserito da un utente sia valido. Lo faremo in PHP, utilizzando due funzioni semplici, evitando così le espressioni regolari, che potrebbero creare problemi e che, come sappiamo, hanno un grado di complessità abbastanza elevato.

Partiamo dalla struttura di un semplice URL:

https://www.youtube.com/watch?v=f4Mc-NYPHaQ

Passando questo indirizzo (come stringa) alle funzioni parse_url() e poi a parse_str(), taglieremo dapprima la parte di stringa che contiene il dominio vero e proprio e otterremo soltanto la parte dei parametri, dalla quale successivamente leggeremo l’ID.

parse_url accetta come parametro una stringa e restituisce un array associativo con i seguenti indici:

  • scheme – ad esempio http
  • host
  • port
  • user
  • pass
  • path
  • querycioè tutto quello dopo il simbolo “?”
  • fragmenttuto quello che viene dopo il cancelletto (#)

Volendo, però, possiamo passare a parse_url() un secondo valore, che dice all’interprete direttamente quale indice tra questi ottenere. In tal caso, otterremo una stringa. A noi, chiaramente interessa la parte dopo il simbolo “?” nella quale c’è l’ID del video. La utilizzeremo, perciò, così:

$query = parse_url( "https://www.youtube.com/watch?v=f4Mc-NYPHaQ", PHP_URL_QUERY );

Adesso che abbiamo isolato la query, che è v=f4Mc-NYPHaQ , vogliamo ottenere la parte dopo il “v=”.

Per farlo, utilizzeremo la funzione parse_str(), che funziona analogamente a $_GET.. ma su una stringa. Accetta, quindi, una stringa con dei valori url encoded e ne crea un array associativo, in questo modo:

parse_str($query, $dati);
$id_youtube=$dati['v'];
echo $id_youtube;
// f4Mc-NYPHaQ

Ed ecco che “v=valore” diventa $dati[‘v’] che contiene “valore”. Mettendo tutto assieme otteniamo:

<?php

$url = "https://www.youtube.com/watch?v=f4Mc-NYPHaQ";
parse_str( parse_url( $url, PHP_URL_QUERY ), $dati );
echo $dati['v'];    
// f4Mc-NYPHaQ

?>