Dada la URL (línea única):
http://test.example.com/dir/subdir/file.html
¿Cómo puedo extraer las siguientes partes usando expresiones regulares:
- El subdominio (prueba)
- El dominio (ejemplo.com)
- La ruta sin el archivo (/ dir / subdir /)
- El archivo (file.html)
- La ruta con el archivo (/dir/subdir/file.html)
- La URL sin la ruta ( http://test.example.com )
- (agregue cualquier otro que considere útil)
La expresión regular debería funcionar correctamente incluso si ingreso la siguiente URL:
http://example.example.com/example/example/example.html
CrackUrl
. Si existe tal función, úsela, es casi seguro que será más confiable y más eficiente que cualquier código hecho a mano.Respuestas:
luego podría analizar el host (delimitado por '.') con bastante facilidad.
Lo que haría es usar algo como esto:
el análisis posterior 'el resto' será lo más específico posible. Hacerlo en una expresión regular es, bueno, un poco loco.
fuente
(.*)?
dado que la estrella de Kleene ya acepta 0 o más, la?
parte (0 o 1) la confunde. Lo arreglé cambiando(.*)?
a(.+)?
. También podría simplemente eliminar el?
http://www.example.com:8080/....
aquí va:^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?(:\d+)?)($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?)(:\d+)?($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((?P<scheme>[^:/?#]+):(?=//))?(//)?(((?P<login>[^:]+)(?::(?P<password>[^@]+)?)?@)?(?P<host>[^@/?#:]*)(?::(?P<port>\d+)?)?)?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?
code
Muestra este código en acción en pythex.orgMe doy cuenta de que llego tarde a la fiesta, pero hay una manera simple de dejar que el navegador analice una url sin una expresión regular:
fuente
http://
, para visualizar correctamente las propiedades de protocolo, host y nombre de host. De lo contrario, el comienzo de la url hasta la primera barra va a la propiedad del protocolo.var url = new URL(someUrl)
Llegué unos años tarde a la fiesta, pero me sorprende que nadie haya mencionado que la especificación Uniform Resource Identifier tiene una sección sobre el análisis de URI con una expresión regular . La expresión regular, escrita por Berners-Lee, et al., Es:
Por lo que vale, descubrí que tenía que escapar de las barras diagonales en JavaScript:
^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
fuente
1
: Esto trata correctamente con otros protocolos, comoftp://
ymailto://
.2
: Esto trata correctamente conusername
ypassword
. Estos campos opcionales están separados por dos puntos, al igual que el nombre de host y el puerto, y disparará la mayoría de las expresiones regulares que he visto. @ RémyDAVID La cadena de consulta tampoco es analizada normalmente por ellocation
objeto del navegador . Si necesita analizar la cadena de consulta, eche un vistazo a mi pequeña biblioteca para eso: uqs .user:[email protected]
, RFC 3986 dice:A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative- path reference.
Encontré que la respuesta más votada (la respuesta de hometoast) no funciona perfectamente para mí. Dos problemas:
La siguiente es una versión modificada:
La posición de las partes es la siguiente:
Editar publicado por un usuario anon:
fuente
http://www.example.com
o si la ruta es de un solo carácterhttp://www.example.com/a
.Necesitaba una expresión regular para que coincidiera con todas las URL e hice esta:
Coincide con todas las URL, cualquier protocolo, incluso las URL como
El resultado (en JavaScript) se ve así:
Una url como
Se ve como esto:
fuente
/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*))?(?:\:([0-9]*))?\/(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
Estaba tratando de resolver esto en javascript, que debería ser manejado por:
ya que (en Chrome, al menos) analiza:
Sin embargo, esto no es un navegador cruzado ( https://developer.mozilla.org/en-US/docs/Web/API/URL ), por lo que combiné esto para extraer las mismas partes que arriba:
El crédito para esta expresión regular va a https://gist.github.com/rpflorence que publicó este jsperf http://jsperf.com/url-parsing (originalmente encontrado aquí: https://gist.github.com/jlong/2428561 # comment-310066 ) a quien se le ocurrió la expresión regular en la que se basó originalmente.
Las partes están en este orden:
También hay una pequeña biblioteca que lo envuelve y proporciona parámetros de consulta:
https://github.com/sadams/lite-url (también disponible en bower)
Si tiene una mejora, cree una solicitud de extracción con más pruebas y la aceptaré y fusionaré con gracias.
fuente
http://test1.dev.mydomain.com/
por ejemplo, se retiraríatest1.dev.
.Proponga una solución mucho más legible (en Python, pero se aplica a cualquier expresión regular):
Huellas dactilares:
fuente
El subdominio y el dominio son difíciles porque el subdominio puede tener varias partes, al igual que el dominio de nivel superior, http://sub1.sub2.domain.co.uk/
(Markdown no es muy amigable para expresiones regulares)
fuente
(http(s?)://[^/]+/)
para también tomar httpsEsta versión mejorada debería funcionar de manera tan confiable como un analizador sintáctico.
fuente
Intenta lo siguiente:
Es compatible con HTTP / FTP, subdominios, carpetas, archivos, etc.
Lo encontré en una búsqueda rápida en Google:
http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx
fuente
De mi respuesta en una pregunta similar . Funciona mejor que algunos de los otros mencionados porque tenían algunos errores (como no admitir nombre de usuario / contraseña, no admitir nombres de archivo de un solo carácter, identificadores de fragmentos rotos).
fuente
Puede obtener todos los http / https, host, puerto, ruta y consulta utilizando el objeto Uri en .NET. la tarea difícil es dividir el host en subdominio, nombre de dominio y TLD.
No existe un estándar para hacerlo y no se puede simplemente usar el análisis de cadenas o RegEx para producir el resultado correcto. Al principio, estoy usando la función RegEx pero no todas las URL pueden analizar el subdominio correctamente. La forma práctica es utilizar una lista de TLD. Después de definir un TLD para una URL, la parte izquierda es dominio y el resto es subdominio.
Sin embargo, la lista debe mantenerse ya que los nuevos TLD son posibles. El momento actual que sé es que publicsuffix.org mantiene la lista más reciente y puede usar las herramientas de analizador de nombres de dominio del código de Google para analizar la lista de sufijos públicos y obtener el subdominio, dominio y TLD fácilmente usando el objeto DomainName: domainName.SubDomain, domainName .Domain y domainName.TLD.
Esto también es útil: obtenga el subdominio de una URL
CaLLMeLaNN
fuente
Aquí hay uno que está completo y no se basa en ningún protocolo.
Huellas dactilares
fuente
Nada de lo anterior funcionó para mí. Esto es lo que terminé usando:
fuente
Me gusta la expresión regular que se publicó en "Javascript: The Good Parts". No es demasiado corto ni demasiado complejo. Esta página en github también tiene el código JavaScript que la usa. Pero se puede adaptar a cualquier idioma. https://gist.github.com/voodooGQ/4057330
fuente
Java ofrece una clase de URL que hará esto. Consultar objetos de URL.
En una nota al margen, PHP ofrece parse_url () .
fuente
Yo recomendaría no usar expresiones regulares. Una llamada a la API como WinHttpCrackUrl () es menos propensa a errores.
http://msdn.microsoft.com/en-us/library/aa384092%28VS.85%29.aspx
fuente
Probé algunos de estos que no cubrían mis necesidades, especialmente los más votados que no captaron una URL sin una ruta ( http://example.com/ )
También la falta de nombres de grupo lo hizo inutilizable en ansible (o tal vez me faltan mis habilidades de jinja2).
así que esta es mi versión ligeramente modificada, siendo la fuente la versión más votada aquí:
fuente
El uso de http://www.fileformat.info/tool/regex.htm regex de hometoast funciona muy bien.
Pero aquí está el trato, quiero usar diferentes patrones de expresiones regulares en diferentes situaciones en mi programa.
Por ejemplo, tengo esta URL y tengo una enumeración que enumera todas las URL compatibles en mi programa. Cada objeto en la enumeración tiene un método getRegexPattern que devuelve el patrón regex que luego se usará para comparar con una URL. Si el patrón de expresiones regulares en particular devuelve verdadero, entonces sé que mi URL admite esta URL. Por lo tanto, cada enumeración tiene su propia expresión regular dependiendo de dónde debe mirar dentro de la URL.
La sugerencia de Hometoast es excelente, pero en mi caso, creo que no ayudaría (a menos que copie y pegue la misma expresión regular en todas las enumeraciones).
Es por eso que quería que la respuesta diera la expresión regular para cada situación por separado. Aunque +1 para hometoast. ;)
fuente
Sé que estás reclamando un lenguaje independiente de esto, pero ¿puedes decirnos qué estás usando solo para que sepamos qué capacidades de expresión regular tienes?
Si tiene las capacidades para no capturar coincidencias, puede modificar la expresión de hometoast para que las subexpresiones que no le interesen capturar se configuren así:
(?:SOMESTUFF)
Todavía tendría que copiar y pegar (y modificar ligeramente) la expresión regular en varios lugares, pero esto tiene sentido: no solo está verificando si existe la subexpresión, sino si existe como parte de una URL . Usar el modificador sin captura para subexpresiones puede darle lo que necesita y nada más, que, si lo estoy leyendo correctamente, es lo que quiere.
Como una pequeña nota, la expresión de hometoast no necesita poner corchetes alrededor de la 's' para 'https', ya que solo tiene un personaje allí. Los cuantificadores cuantifican el carácter único (o clase de caracteres o subexpresión) que los precede directamente. Entonces:
https?
coincidiría con 'http' o 'https' muy bien.
fuente
regexp para obtener la ruta URL sin el archivo.
url = ' http: // dominio / dir1 / dir2 / algún archivo ' url.scan (/ ^ (http: // [^ /] +) ((?: / [^ /] +) + (? = /)) ? /? (?: [^ /] +)? $ / i) .to_s
Puede ser útil para agregar una ruta relativa a esta url.
fuente
La expresión regular para hacer un análisis completo es bastante horrible. He incluido referencias con nombre para legibilidad, y he dividido cada parte en líneas separadas, pero todavía se ve así:
Lo que requiere que sea tan detallado es que, excepto por el protocolo o el puerto, cualquiera de las partes puede contener entidades HTML, lo que hace que la delineación del fragmento sea bastante complicada. Entonces, en los últimos casos: el host, la ruta, el archivo, la cadena de consulta y el fragmento, permitimos cualquier entidad html o cualquier carácter que no sea un
?
o#
. La expresión regular para una entidad html se ve así:Cuando se extrae (utilicé una sintaxis de bigote para representarlo), se vuelve un poco más legible:
En JavaScript, por supuesto, no puede usar referencias de fondo con nombre, por lo que la expresión regular se convierte en
y en cada coincidencia, el protocolo es
\1
, el host es\2
, el puerto\3
, la ruta\4
, el archivo\5
, la cadena de consulta\6
y el fragmento\7
.fuente
fuente
Intenté esta expresión regular para analizar particiones de URL:
URL:
https://www.google.com/my/path/sample/asd-dsa/this?key1=value1&key2=value2
Partidos:
fuente
Proporcionará el siguiente resultado:
1: https: //
2: www.thomas-bayer.com
3: /
4: axis2 / services / BLZService? Wsdl
Si cambia la URL a
String s = " https: //www.thomas -bayer.com?wsdl=qwerwer&ttt=888 "; la salida será la siguiente:
1: https: //
2: www.thomas-bayer.com
3:?
4: wsdl = qwerwer & ttt = 888
disfruta ..
Yosi Lev
fuente