Estoy en JavaScript no moderno y tengo una cadena definida de la siguiente manera:

"//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0"

Quiero extraer solo el DmYK479EpQc pero no sé la longitud. Sé que quiero lo que está después del / y antes del ?

¿Hay algunas líneas simples de JavaScript que resuelvan esto?

1
Pete 10 may. 2019 a las 04:11

5 respuestas

¿Qué tal una forma no regex?

console.log("//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0".split('/').pop().split('?')[0]);
1
Always Sunny 10 may. 2019 a las 01:34

Puedes usar esta expresión regular

.* combina y consume todo hasta [A-z0-9]+ luego empareja y captura cualquier número y carácter entre A-z .* luego consume el resto de la entrada

const ytUrl = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';
const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
const position = '$3';

let result = ytUrl.replace(regex, position);

console.log('YouTube ID: ', result);

Esta expresión regular simplemente divide la cadena en diferentes secciones y la identificación de YouTube está en la 3ra posición.

Otra solución es usar split. Este método divide una cadena en una matriz de subcadenas.

const ytUrl = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';

let result = ytUrl.split('/').pop().split('?').shift()

console.log('YouTube ID: ', result);

En este ejemplo, dividimos la URL usando / como separador. Luego tomamos el último elemento de la matriz con el método pop. y finalmente nos dividimos nuevamente usando ? como separador y tomamos el primer elemento de la matriz con el método shift.

0
Teocci 10 may. 2019 a las 01:57

Una opción usa un reemplazo de expresiones regulares:

var url = "//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0";
var path = url.replace(/.*\/([^?]+).*/, "$1");
console.log(path);

El patrón regex anterior dice:

.*       match and consume everything up to and
/        including the last path separator
([^?]+)  then match and capture any number of non ? characters
.*       then consume the rest of the input

Luego, simplemente reemplazamos con el primer grupo de captura, que corresponde al texto después del separador de ruta final, pero antes del inicio de la cadena de consulta, si la URL tiene uno.

0
Tim Biegeleisen 10 may. 2019 a las 01:34

No voy a dar un código porque es un algoritmo relativamente simple y fácil de implementar.

Tenga en cuenta que esos enlaces tienen este formato (corríjame si me equivoco):

  • https:// o http://
  • www.youtube.com/
  • embed/
  • ID de video (DmYK479EpQc en este caso)
  • ?parameters (tenga en cuenta que SIEMPRE comienzan con el carácter ?)

Desea la ID del video, por lo que puede dividir la cadena en esas secciones y si almacena esas secciones en una matriz, puede estar seguro de que la ID está en la tercera posición.

Un ejemplo de cómo se vería esa matriz sería:

['https://', 'www.youtube.com', 'embed', 'DmYK479EpQc', '?vq=hd720&rel=0']

0
Pablo Navarro 10 may. 2019 a las 01:25

¿Usar el objeto URL?

console.log(
   (new URL("//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0", location.href)).pathname
   .split('/')
   .pop());

¿Por qué? Porque probablemente pueda inventar una URL que derrote la expresión regular (aunque para youtube probablemente sea poco probable)

2
gman 10 may. 2019 a las 01:40