La URL de un video de YouTube se puede encontrar en una variedad de formatos:
- último formato corto:
http://youtu.be/NLqAF9hrVbY
- iframe:
http://www.youtube.com/embed/NLqAF9hrVbY
- iframe (seguro):
https://www.youtube.com/embed/NLqAF9hrVbY
- parámetro de objeto:
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
- objeto incrustado:
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
- reloj:
http://www.youtube.com/watch?v=NLqAF9hrVbY
- usuarios:
http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
- ytscreeningroom:
http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
- ¡todo vale!:
http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
- cualquier / subdominio / también:
http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
- más parámetros:
http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
- la consulta puede tener un punto:
http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
- dominio nocookie:
http://www.youtube-nocookie.com
Aquí hay una función PHP con una expresión regular comentada que coincide con cada uno de estos formularios de URL y los convierte en enlaces (si aún no son enlaces):
// Linkify youtube URLs which are not already links.
function linkifyYouTubeURLs($text) {
$text = preg_replace('~(?#!js YouTubeId Rev:20160125_1800)
# Match non-linked youtube URL in the wild. (Rev:20130823)
https?:// # Required scheme. Either http or https.
(?:[0-9A-Z-]+\.)? # Optional subdomain.
(?: # Group host alternatives.
youtu\.be/ # Either youtu.be,
| youtube # or youtube.com or
(?:-nocookie)? # youtube-nocookie.com
\.com # followed by
\S*? # Allow anything up to VIDEO_ID,
[^\w\s-] # but char before ID is non-ID char.
) # End host alternatives.
([\w-]{11}) # $1: VIDEO_ID is exactly 11 chars.
(?=[^\w-]|$) # Assert next char is non-ID or EOS.
(?! # Assert URL is not pre-linked.
[?=&+%\w.-]* # Allow URL (query) remainder.
(?: # Group pre-linked alternatives.
[\'"][^<>]*> # Either inside a start tag,
| </a> # or inside <a> element text contents.
) # End recognized pre-linked alts.
) # End negative lookahead assertion.
[?=&+%\w.-]* # Consume any URL (query) remainder.
~ix', '<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>',
$text);
return $text;
}
; // Fin de $ YouTubeId.
Y aquí hay una versión de JavaScript con la misma expresión regular (sin comentarios):
// Linkify youtube URLs which are not already links.
function linkifyYouTubeURLs(text) {
var re = /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\S*?[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/ig;
return text.replace(re,
'<a href="http://www.youtube.com/watch?v=$1">YouTube link: $1</a>');
}
Notas:
- La parte ID_DE_VÍDEO de la URL es capturado en el grupo único de captura:
$1
.
- Si sabe que su texto no contiene ninguna URL enlazada previamente, puede eliminar de forma segura la aserción de búsqueda anticipada negativa que prueba esta condición (la afirmación que comienza con el comentario: "La URL de afirmación no está enlazada previamente" ). Esto acelerará sube un poco la expresión regular.
- La cadena de reemplazo se puede modificar para adaptarla. La proporcionada por encima de simplemente crea un enlace al genérico
"http://www.youtube.com/watch?v=VIDEO_ID"
URL estilo y establece el texto del enlace a: "YouTube link: VIDEO_ID"
.
Editar 2011-07-05: Se agregó un -
guión a la clase de identificación de caracteres
Editar 2011-07-17: Se corrigió la expresión regular para consumir cualquier parte restante (por ejemplo, consulta ) de la URL después de la ID de YouTube. Se agregó 'i'
un modificador de ignorar mayúsculas y minúsculas . Función renombrada a camelCase. Prueba de anticipación predefinida mejorada.
Editar 2011-07-27: Se agregaron nuevos formatos de "usuario" y "ytscreeningroom" de las URL de YouTube.
Editar 2011-08-02: simplificado / generalizado para manejar las nuevas URL de YouTube de "cualquier cosa o cosa".
Editar 2011-08-25: Varias modificaciones:
- Se agregó una versión de Javascript de:
linkifyYouTubeURLs()
function.
- La versión anterior tenía la parte del esquema (protocolo HTTP) opcional y, por lo tanto, coincidiría con las URL no válidas. Hizo el esquema parte requerida.
- La versión anterior usaba la
\b
palabra anclaje de límite alrededor de VIDEO_ID. Sin embargo, esto no funcionará si VIDEO_ID comienza o termina con un -
guión. Se corrigió para que maneje esta condición.
- Se modificó la expresión VIDEO_ID para que tenga exactamente 11 caracteres.
- La versión anterior no podía excluir las URL vinculadas previamente si tenían una cadena de consulta después de VIDEO_ID. Se mejoró la afirmación de anticipación negativa para solucionar este problema.
- Se agregó
+
y %
a la cadena de consulta coincidente de clase de carácter.
- Se cambió la versión PHP de expresiones regulares delimitador de:
%
a: ~
.
- Se agregó una sección de "Notas" con algunas notas útiles.
Editar 2011-10-12: La parte del host de la URL de YouTube ahora puede tener cualquier subdominio (no solo www.
).
Editar 2012-05-01: La sección de URL de consumo ahora puede permitir '-'.
Editar 2013-08-23: formato adicional proporcionado por @Mei. (La parte de la consulta puede tener un .
punto.
Editar 11/30/2013: Añadido formato adicional proporcionada por @CRONUS: youtube-nocookie.com
.
Editar 2016-01-25: expresión regular fija para manejar el caso de error proporcionado por CRONUS.