Intercambie todas las URL de YouTube para incrustar a través de preg_replace ()

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?

preguntado el 03 de mayo de 12 a las 17:05

4 Respuestas

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

¡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é

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

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

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 or haz tu propia pregunta.