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)
Il modo più semplice e robusto non sarebbe usando un'espressione regolare. – FailedDev
@FailedDev Preoccupati di mostrarmi come (non deve essere la stessa funzione)? – domino
Stai passando parte del codice HTML con il $ stringa giusto? Come si ottiene quella stringa? – FailedDev