Intercambie todas las URL de YouTube para incrustar a través de preg_replace ()
Frecuentes
Visto 7,166 veces
3
Hola, estoy tratando de convertir enlaces de YouTube en código de inserción.
Esto es lo que tengo:
<?php
$text = $post->text;
$search = '#<a(.*?)(?:href="https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch?.*?v=))([\w\-]{10,12}).*$#x';
$replace = '<center><iframe width="560" height="315" src="http://www.youtube.com/embed/$2" frameborder="0" allowfullscreen></iframe></center>';
$text = preg_replace($search, $replace, $text);
echo $text;
?>
Funciona para un enlace. Sin embargo, si agrego dos, solo cambiará la última aparición. ¿Qué tengo que cambiar?
4 Respuestas
6
No estás manejando el final de la cadena correctamente. Quitar el $
y reemplácelo con la etiqueta de cierre </a>
. esto lo arreglará.
$search = '#<a(.*?)(?:href="https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch?.*?v=))([\w\-]{10,12}).*<\/a>#x';
$replace = '<center><iframe width="560" height="315" src="http://www.youtube.com/embed/$2" frameborder="0" allowfullscreen></iframe></center>';
$text = preg_replace($search, $replace, $text);
contestado el 03 de mayo de 12 a las 17:05
0
Pruebe lo siguiente: preg_replace($search, $replace, $text, -1);
Sé que es el predeterminado, pero quién sabe...
EDITAR Intente eso si no funciona;
do{
$text = preg_replace($search, $replace, $text, -1, $Count);
}
while($Count);
contestado el 03 de mayo de 12 a las 17:05
0
Aquí hay una expresión regular más eficiente: http://pregcopy.com/exp/26, traduzca esto a PHP: (agregue el modificador "s")
<?php
$text = $post->text;
$search = '#<a (?:.*?)href=["\\\']http[s]?:\/\/(?:[^\.]+\.)*youtube\.com\/(?:v\/|watch\?(?:.*?\&)?v=|embed\/)([\w\-\_]+)["\\\']#ixs';
$replace = '<center><iframe width="560" height="315" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe></center>';
$text = preg_replace($search, $replace, $text);
echo $text;
?>
Pruébalo
contestado el 03 de mayo de 12 a las 17:05
0
Hay dos tipos de enlace de YouTube para un video:
Ejemplo:
$link1 = 'https://www.youtube.com/watch?v=NVcpJZJ60Ao';
$link2 = 'https://www.youtu.be/NVcpJZJ60Ao';
Esta función maneja ambos:
function getYoutubeEmbedUrl($url)
{
$shortUrlRegex = '/youtu.be\/([a-zA-Z0-9_-]+)\??/i';
$longUrlRegex = '/youtube.com\/((?:embed)|(?:watch))((?:\?v\=)|(?:\/))([a-zA-Z0-9_-]+)/i';
if (preg_match($longUrlRegex, $url, $matches)) {
$youtube_id = $matches[count($matches) - 1];
}
if (preg_match($shortUrlRegex, $url, $matches)) {
$youtube_id = $matches[count($matches) - 1];
}
return 'https://www.youtube.com/embed/' . $youtube_id ;
}
La salida de $link1 o $link2 sería la misma:
$output1 = getYoutubeEmbedUrl($link1);
$output2 = getYoutubeEmbedUrl($link2);
// output for both: https://www.youtube.com/embed/NVcpJZJ60Ao
¡Ahora puede usar la salida en iframe!
Respondido 02 Oct 19, 20:10
@Toto gracias por la sugerencia, copié esta expresión regular de un sitio web y no tengo idea de qué $matches[count($matches) - 1]
¡¡significar!! Pero creo que podría ser así: $matches[0]
no esta: $matches[-1]
¿derecho? porque tendremos un partido y será el primero en $matches
formación. - Ahmad Mobaraki
Lo siento, lo mezclé con otro idioma, donde $matches[-1]
representa el último índice, en PHP tenemos que usar end($matches)
. Aquí tenemos 3 elementos en la matriz. Por favor, no copie/pegue el código de un sitio externo sin probarlo. Por lo menos da la referencia. - Toto
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php preg-replace or haz tu propia pregunta.
¡Gracias! Debo haberlo perdido en todos esos símbolos de expresiones regulares. - Axel
Claro, y también te estás perdiendo el significado de codicioso en el dominio regex. - hakré