Recomiendo usar el paquete npm psl (Lista de sufijos públicos) . La "Lista de sufijos públicos" es una lista de todos los sufijos y reglas de dominio válidos, no solo los dominios de nivel superior de código de país, sino también los caracteres unicode que se considerarían el dominio raíz (es decir, www. 食 狮. 公司 .cn, bckobe .jp, etc.). Lea más sobre esto aquí .
Tratar:
npm install --save psl
Luego, con mi ejecución "extractHostname", ejecute:
let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com
No puedo usar un paquete npm, así que a continuación solo prueba extractHostname.
function extractHostname(url) {
var hostname;
//find & remove protocol (http, ftp, etc.) and get hostname
if (url.indexOf("//") > -1) {
hostname = url.split('/')[2];
}
else {
hostname = url.split('/')[0];
}
//find & remove port number
hostname = hostname.split(':')[0];
//find & remove "?"
hostname = hostname.split('?')[0];
return hostname;
}
//test the code
console.log("== Testing extractHostname: ==");
console.log(extractHostname("http://www.blog.classroom.me.uk/index.php"));
console.log(extractHostname("http://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("https://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("ftps://ftp.websitename.com/dir/file.txt"));
console.log(extractHostname("websitename.com:1234/dir/file.txt"));
console.log(extractHostname("ftps://websitename.com:1234/dir/file.txt"));
console.log(extractHostname("example.com?param=value"));
console.log(extractHostname("https://facebook.github.io/jest/"));
console.log(extractHostname("//youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("http://localhost:4200/watch?v=ClkQA2Lb_iE"));
Independientemente de tener el protocolo o incluso el número de puerto, puede extraer el dominio. Esta es una solución muy simplificada, no regex, así que creo que esto funcionará.
* Gracias @Timmerz, @renoirb, @rineez, @BigDong, @ ra00l, @ILikeBeansTacos, @CharlesRobertson por sus sugerencias. @ ross-allen, ¡gracias por informar del error!
url.split('/')[2]
Desde independientemente de que escribimosftp
,ftps
,https
, el nombre de dominio siempre estará en el índice 2.return url.split('/')[2] || url.split('/')[0];
qué coincidencias si no hay un protocolo.if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
Un buen truco sin usar expresiones regulares:
Envuelva lo anterior en una función como la siguiente y tendrá una excelente manera de extraer la parte del dominio de un URI.
fuente
hostname
, no debería, si quieres acceder tanto alhostname
y alport
(y obtenerlo comodomain.sample:1234
solo accesoa.host
)No hay necesidad de analizar la cadena, solo pasa tu URL como argumento al
URL
constructor :fuente
Prueba esto:
Si desea excluir el puerto de su resultado, use esta expresión en su lugar:
Editar: para evitar que dominios específicos coincidan, use una búsqueda anticipada negativa.
(?!youtube.com)
fuente
?' (query) or
# `(fragmento) por ejemplohttp://example.com?var=val
ohttp://example.com#fragment
. Por lo tanto, la expresión regular correcta debería ser algo como:/^https?\:\/\/([^\/?#]+)/
. Aparte de eso, obtendrías mi +1 (esta es la solución más rápida)(?:www\.)?
en la búsqueda anticipada negativa.(?:www\.)?
a la expresión regular así:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
Analizar una URL puede ser complicado porque puede tener números de puerto y caracteres especiales. Como tal, recomiendo usar algo como parseUri para hacer esto por usted. Dudo que el rendimiento sea un problema a menos que esté analizando cientos de URL.
fuente
URL()
Todavía no es totalmente compatible. Compruebe: caniuse.com/#feat=urlRespuesta 2020
¡No necesitas ninguna dependencia adicional para esto! Dependiendo de si necesita optimizar el rendimiento o no, hay dos buenas soluciones:
Usar
URL.hostname
para facilitar la lecturaEn la era de Babel, la solución más limpia y fácil es usar
URL.hostname
.URL.hostname
es parte de la API de URL , compatible con todos los principales navegadores, excepto IE ( caniuse ). Utilice un polyfill de URL si necesita admitir navegadores heredados.El uso de esta solución también le dará acceso a otras propiedades y métodos de URL . Esto será útil si también desea extraer el nombre de ruta de la URL o los parámetros de cadena de consulta , por ejemplo.
Use RegEx para el rendimiento
URL.hostname
es más rápido que usar la solución de anclaje o parseUri . Sin embargo, todavía es mucho más lento que la expresión regular de gilly3 :Pruébelo usted mismo en este jsPerf
Si necesita procesar una gran cantidad de URL (donde el rendimiento sería un factor), le recomiendo usar esta solución. De lo contrario, elija la
URL.hostname
legibilidad.fuente
Traté de usar las soluciones de Given, la Elegida fue una exageración para mi propósito y "Crear un elemento" me fastidia.
Todavía no está listo para Puerto en URL. Espero que alguien lo encuentre útil
Ejecutando esto:
Resultado:
fuente
Si termina en esta página y está buscando el mejor REGEX de URLS, pruebe este:
https://regex101.com/r/pX5dL9/1
Funciona para urls sin http: //, con http, con https, con solo // y no toma la ruta y la ruta de consulta también.
Buena suerte
fuente
Todas las propiedades de URL, sin dependencias, sin JQuery, fácil de entender
Esta solución le da su respuesta más propiedades adicionales. No se requieren JQuery u otras dependencias, pegar y listo.
Uso
Salida
Código
El código está diseñado para ser fácil de entender en lugar de súper rápido. Se puede invocar fácilmente 100 veces por segundo, por lo que es ideal para aplicaciones de servidor o algunos usos del servidor, pero no para un rendimiento de alto volumen.
fuente
getUrlParts('www.google.com')
en una consola en esta página.var url="https://mail.gggg.google.cn/link/link/link";
eldomainroot
debería sergoogle.com
pero SALIDAS:gggg.google.cn
mientras que elgggg
es un sub-dominio (dominios pueden tener múltiples sub-dominios).Simplemente use el constructor URL () :
fuente
Estaba buscando una solución a este problema hoy. Ninguna de las respuestas anteriores pareció satisfacer. Quería una solución que pudiera ser un trazador de líneas, sin lógica condicional y nada que tuviese que incluir una función.
Esto es lo que se me ocurrió, parece funcionar muy bien:
Puede parecer complicado a primera vista, pero funciona de manera bastante simple; la clave está usando 'slice (-n)' en un par de lugares donde la parte buena tiene que ser extraída del final de la matriz dividida (y [0] para llegar desde el frente de la matriz dividida).
Cada una de estas pruebas devuelve "example.com":
fuente
Aquí está el jQuery one-liner:
fuente
fuente
El crédito original va a: http://www.primaryobjects.com/CMS/Article145
fuente
Bien, sé que esta es una vieja pregunta, pero hice un analizador de URL súper eficiente, así que pensé en compartirlo.
Como puede ver, la estructura de la función es muy extraña, pero es por eficiencia. No se utilizan funciones prototipo, la cadena no se repite más de una vez y no se procesa ningún carácter más de lo necesario.
fuente
Esta no es una respuesta completa, pero el siguiente código debería ayudarlo:
Me gustaría que alguien creara código más rápido que el mío. Ayuda a mejorar mi yo también.
fuente
en línea con jquery
fuente
fuente
Personalmente investigué mucho para esta solución, y la mejor que pude encontrar es en realidad la "comprobación del navegador" de CloudFlare:
Reescribí las variables para que sea más legible "humano", pero hace el trabajo mejor de lo esperado.
fuente
Bueno, usar una expresión regular será mucho más fácil:
fuente
Esto se encarga tanto del protocolo.
fuente
en pocas palabras puedes hacer así
Use la función anterior para obtener el nombre de dominio
fuente
?
en la cadena de nombre de dominio y en lugar dereturn domain.split("/")[0];
poner estareturn domain.split("?")[0];
esperanza que funcioneParse-Urls parece ser la biblioteca de JavaScript con los patrones más robustos
Aquí hay un resumen de las características:
Capítulo 1. Normalizar o analizar una URL
Capítulo 2. Extraiga todas las URL
Capítulo 3. Extraiga los URI con ciertos nombres
Capítulo 4. Extraiga todas las URL difusas
Capítulo 5. Resalte todas las URL en los textos
Capítulo 6. Extraiga todas las URL en HTML o XML sin procesar
fuente
Código:
Resultado:
fuente
www.
aunque no todas las URL tengan este componente), pero sin duda es una respuesta .parse-domain : una biblioteca ligera muy sólida
npm install parse-domain
Ejemplo 1
Ejemplo 2
¿Por qué?
Dependiendo del caso de uso y el volumen, le recomiendo no resolver este problema usted mismo utilizando regex u otros medios de manipulación de cadenas. El núcleo de este problema es que necesita conocer todos los sufijos gtld y cctld para analizar correctamente las cadenas de URL en dominios y subdominios, estos sufijos se actualizan regularmente. Este es un problema resuelto y no uno que desee resolver usted mismo (a menos que sea google o algo así). A menos que necesite el nombre de host o el nombre de dominio en un apuro, no intente analizar este camino.
fuente
Mi código se ve así. Las expresiones regulares pueden venir en muchas formas, y aquí están mis casos de prueba, creo que es más escalable.
fuente
Pruebe el siguiente código para el nombre de dominio exacto usando regex,
String line = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";
fuente