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?
5 respuestas
¿Qué tal una forma no regex?
console.log("//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0".split('/').pop().split('?')[0]);
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
.
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.
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://
ohttp://
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']
¿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)
Preguntas relacionadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.