2011-11-19 9 views
6

Questa funzione incorpora i video di YouTube se trovati in una stringa.Sostituisci l'URL di YouTube nel testo con il codice HTML incorporato

La mia domanda è quale sarebbe il modo più semplice per acquisire solo il video incorporato (l'iframe e solo il primo se ce ne sono altri) e ignorare il resto della stringa.

function youtube($string,$autoplay=0,$width=480,$height=390) 
{ 
preg_match('#(v\/|watch\?v=)([\w\-]+)#', $string, $match); 
    return preg_replace(
    '#((http://)?(www.)?youtube\.com/watch\?[=a-z0-9&_;-]+)#i', 
    "<div align=\"center\"><iframe title=\"YouTube video player\" width=\"$width\" height=\"$height\" src=\"http://www.youtube.com/embed/$match[2]?autoplay=$autoplay\" frameborder=\"0\" allowfullscreen></iframe></div>", 
    $string); 
} 
+0

Il modo più semplice e robusto non sarebbe usando un'espressione regolare. – FailedDev

+0

@FailedDev Preoccupati di mostrarmi come (non deve essere la stessa funzione)? – domino

+0

Stai passando parte del codice HTML con il $ stringa giusto? Come si ottiene quella stringa? – FailedDev

risposta

13

Ok, penso di vedere quello che stai cercando di realizzare. Un utente inserisce un blocco di testo (qualche commento o qualsiasi altra cosa) e trova un URL di YouTube in quel testo e lo sostituisce con il codice di incorporamento del video effettivo.

Ecco come ho modificato è:

function youtube($string,$autoplay=0,$width=480,$height=390) 
{ 
    preg_match('#(?:http://)?(?:www\.)?(?:youtube\.com/(?:v/|watch\?v=)|youtu\.be/)([\w-]+)(?:\S+)?#', $string, $match); 
    $embed = <<<YOUTUBE 
     <div align="center"> 
      <iframe title="YouTube video player" width="$width" height="$height" src="http://www.youtube.com/embed/$match[1]?autoplay=$autoplay" frameborder="0" allowfullscreen></iframe> 
     </div> 
YOUTUBE; 

    return str_replace($match[0], $embed, $string); 
} 

Dal momento che si sta già individuare l'URL con il primo preg_match(), non c'è bisogno di eseguire un'altra funzione regex per la sua sostituzione. Abbinalo all'intero URL, quindi esegui un semplice str_replace() dell'intera partita ($match[0]). Il codice video viene catturato nel primo subpattern ($match[1]). Sto usando preg_match() perché vuoi solo abbinare il primo URL trovato. Dovresti usare preg_match_all() e modificare un po 'il codice se vuoi che corrisponda a tutti gli URL, non solo al primo.

Ecco una spiegazione della mia espressione regolare:

(?:http://)? # optional protocol, non-capturing 
(?:www\.)?  # optional "www.", non-capturing 
(?: 
       # either "youtube.com/v/XXX" or "youtube.com/watch?v=XXX" 
    youtube\.com/(?:v/|watch\?v=) 
    | 
    youtu\.be/  # or a "youtu.be" shortener URL 
) 
([\w-]+)  # the video code 
(?:\S+)?  # optional non-whitespace characters (other URL params) 
+0

Ho cercato questo script su tutta la rete. Questo funziona ma rileva solo il primo URL nel contenuto. Ad esempio, ho 3 URL di YouTube nel contenuto. Il primo video verrà incorporato mentre gli altri mostreranno solo i link. Cosa devo fare? – Wilf

+0

Ce l'ho! Basta cambiare 'preg_match' in' preg_match_all' ... Grazie mille! – Wilf

+0

L'ho trovato funzionante: http://stackoverflow.com/a/5452862/1620626 – Wilf

Problemi correlati