analizar la identificación del video de youtube usando preg_match [duplicate]

8 minutos de lectura

analizar la identificacion del video de youtube usando preg match duplicate
JC

Estoy intentando analizar la ID de video de una URL de youtube usando preg_match. Encontré una expresión regular en este sitio que parece funcionar;

(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+

Como se muestra en esta foto:

texto alternativo

Mi PHP es el siguiente, pero no funciona (da el modificador Desconocido ‘[‘error)[‘error)

<?
 $subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";

 preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);

 print "<pre>";
 print_r($matches);
 print "</pre>";

?>

Salud

  • En su RegexBuddy, tiene Java como idioma seleccionado. También hay una pestaña Usar en la que puede hacer clic que le dará un código de escape adecuado para usar en una serie de situaciones diferentes.

    – benjam

    1 de julio de 2011 a las 3:25

  • Vea también: php regex – encuentre todas las identificaciones de video de youtube en una cadena

    – hakré

    2 de junio de 2012 a las 12:33


  • Relacionado: stackoverflow.com/questions/5830387/…

    – Timo Huovinen

    12 de marzo de 2014 a las 11:34

  • Porque la otra pregunta tiene una mejor respuesta, bien explicada.

    – Totó

    8 de febrero de 2020 a las 17:27


  • @Toto tampoco coincide en algunos casos, si ve los últimos comentarios, por lo que no es exactamente la mejor respuesta

    – JC

    8 de febrero de 2020 a las 19:49

analizar la identificacion del video de youtube usando preg match duplicate
benjam

Esta expresión regular toma la ID de todas las diversas URL que pude encontrar… Puede haber más, pero no pude encontrar referencias de ellas en ninguna parte. Si encuentra uno que no coincide, deje un comentario con la URL e intentaré actualizar la expresión regular para que coincida con su URL.

if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/\s]{11})%i', $url, $match)) {
    $video_id = $match[1];
}

Aquí hay una muestra de las URL que coinciden con esta expresión regular: (puede haber más contenido después de la URL dada que se ignorará)

También funciona en la URL de youtube-nocookie.com con las mismas opciones anteriores.

También extraerá la ID de la URL en un código de inserción (tanto etiquetas de iframe como de objeto)

  • Estoy usando la expresión proporcionada anteriormente y siempre obtengo la terminación /iframe> en la identificación del video.

    – Jason Yost

    1 de enero de 2012 a las 11:24

  • ¿Puede dar un enlace a un ejemplo de pastebin de lo que está haciendo exactamente? ¿O crear una pregunta aquí en SO y vincularla aquí?

    – benjam

    2 de enero de 2012 a las 5:06


  • De nuevo… ¿tienes un ejemplo de código? ¿Lo estás usando correctamente? Acabo de probarlo con su URL, y devolvió una matriz y en $match[1] era '9ofSV-ATEB0'que ES el id.

    – benjam

    27 de enero de 2012 a las 4:00

  • @Benjam, ¿tienes un preg_match para vimeo que sea como este? Este es un gran regX +1. ¡Gracias!

    – Juan González

    15 de abril de 2012 a las 17:03

  • Tengo mejores resultados para /?v= y iframe/objeto variantes al mover el nombre de usuario/… comprobar ([^/]+/.+/) al fondo: %(?:youtube(?:-nocookie)?\.com/(?:(?:v|e(?:mbed)?)/|.*[?&]v=|[^/]+/.+/)|youtu\.be/)([^"&?/ ]{11})%i. Para otras variantes sigue siendo el mismo.

    – Veta

    5 de febrero de 2013 a las 12:05


mejor uso parse_url y parse_str para analizar la URL y la cadena de consulta:

$subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
$url = parse_url($subject);
parse_str($url['query'], $query);
var_dump($query);

  • @Webbo: parse_url devuelve una matriz de las partes de la URL, por lo que la ruta de la URL también está allí. Debe hacer una diferenciación adicional de casos sobre qué tipo es la URL.

    – Gumbo

    29 mayo 2010 a las 20:36

  • Preferiría usar una expresión regular para hacerlo todo en uno

    – JC

    29 mayo 2010 a las 20:40

Tuve que lidiar con esto para una clase de PHP que escribí hace unas semanas y terminé con una expresión regular que coincide con cualquier tipo de cadena: con o sin esquema de URL, con o sin subdominio, cadenas de URL de youtube.com, URL de youtu.be cadenas y tratar con todo tipo de clasificación de parámetros. puedes comprobarlo en GitHub o simplemente copie y pegue el bloque de código a continuación:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */        
function parse_yturl($url) 
{
    $pattern = '#^(?:https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x';
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}

Para explicar la expresión regular, aquí hay una versión derramada:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */        
function parse_yturl($url) 
{
    $pattern = '#^(?:https?://)?';    # Optional URL scheme. Either http or https.
    $pattern .= '(?:www\.)?';         #  Optional www subdomain.
    $pattern .= '(?:';                #  Group host alternatives:
    $pattern .=   'youtu\.be/';       #    Either youtu.be,
    $pattern .=   '|youtube\.com';    #    or youtube.com
    $pattern .=   '(?:';              #    Group path alternatives:
    $pattern .=     '/embed/';        #      Either /embed/,
    $pattern .=     '|/v/';           #      or /v/,
    $pattern .=     '|/watch\?v=';    #      or /watch?v=,    
    $pattern .=     '|/watch\?.+&v='; #      or /watch?other_param&v=
    $pattern .=   ')';                #    End path alternatives.
    $pattern .= ')';                  #  End host alternatives.
    $pattern .= '([\w-]{11})';        # 11 characters (Length of Youtube video ids).
    $pattern .= '(?:.+)?$#x';         # Optional other ending URL parameters.
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}

  • Por favor, no publiques tu respuesta varias veces. En su lugar, marque como duplicados o agregue un comentario que diga que hay una respuesta en otra pregunta si no son duplicados exactos pero aún son relevantes.

    – Flexografía

    10 de mayo de 2012 a las 7:51

  • @awoodland: No hay problema y gracias por señalarme la posibilidad de marcar las preguntas como duplicadas.

    – llamar la atención

    10 de mayo de 2012 a las 10:59

Perfeccioné expresiones regulares de la respuesta del líder. También toma el ID de todas las distintas URL, pero más correctamente.

if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[\w\-?&!#=,;]+/[\w\-?&!#=/,;]+/|(?:v|e(?:mbed)?)/|[\w\-?&!#=,;]*[?&]v=)|youtu\.be/)([\w-]{11})(?:[^\w-]|\Z)%i', $url, $match)) {
    $video_id = $match[1];
}

Además, maneja correctamente las identificaciones incorrectas, que tienen más de 11 caracteres.

http://www.youtube.com/watch?v=0zM3nApSvMgDw3qlxF

Utilizar

 preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);

  • Esto funciona pero lo acabo de probar con la URL youtube.com/v/z_AbfPXTKms&hl=en_GB&fs=1& y falla, podrías modificarlo para que funcione con ese formato también?

    – JC

    29 mayo 2010 a las 20:33

  • Acepto esta respuesta ya que responde a mi pregunta original. Ahora estoy trabajando en modificarlo para que funcione con la URL. youtube.com/v/z_AbfPXTKms&hl=en_GB&fs=1&

    – JC

    31 de mayo de 2010 a las 14:28

1646962870 92 analizar la identificacion del video de youtube usando preg match duplicate
Adrián Novan

Olvidaste escapar del carácter de barra oblicua. Así que este debería hacer el trabajo:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]\/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);

  • Esto funciona pero lo acabo de probar con la URL youtube.com/v/z_AbfPXTKms&hl=en_GB&fs=1& y falla, podrías modificarlo para que funcione con ese formato también?

    – JC

    29 mayo 2010 a las 20:33

  • Acepto esta respuesta ya que responde a mi pregunta original. Ahora estoy trabajando en modificarlo para que funcione con la URL. youtube.com/v/z_AbfPXTKms&hl=en_GB&fs=1&

    – JC

    31 de mayo de 2010 a las 14:28

1646962871 546 analizar la identificacion del video de youtube usando preg match duplicate
alan moore

Parse Start parámetro para BBcode (https://developers.google.com/youtube/player_parameters#start)

ejemplo: [yt]http://www.youtube.com/watch?v=G059ou-7wmo#t=58[/yt]

PHP expresión regular:

'#\[yt\]https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/ytscreeningroom\?v=|/feeds/api/videos/|/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=#&+%\w-]*(t=(\d+))?\[/yt\]#Uim'

reemplazar:

'<iframe id="ytplayer" type="text/html" width="639" height="360" src="http://www.youtube.com/embed/$1?rel=0&vq=hd1080&start=$3" frameborder="0" allowfullscreen></iframe>'

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad