2009-07-24 25 views
27

Estoy usando una expresión regular para convertir URL de texto sin formato a enlaces en los que se puede hacer clic.¿Puede una URL contener un punto y coma?

@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@

Sin embargo, a veces en el cuerpo del texto, URL se enumeran una por línea con un punto y coma al final. La URL real no contiene ningún ";"

http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=275; 
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=123; 
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=124 

¿Está permitido tener un punto y coma (;) en un URL o puede ser el punto y coma considerado como un marcador de la final de una URL? ¿Cómo encajaría eso en mi expresión regular?

Respuesta

35

A semicolon is reserved y no se puede utilizar sin codificar a excepción de su propósito especial (que depende del esquema). Sección 2.2:

Muchos esquemas de URL se reservan ciertas caracteres para un significado especial: su aparición en la parte específica del esquema de la URL tiene un semántica designados. Si el carácter correspondiente a un octeto está reservado en un esquema, debe codificarse el octeto . Los caracteres ";", "/", "?", ":", "@", "=" Y "&" son los caracteres que pueden ser reservados para un significado especial dentro de un esquema . Ningún otro carácter puede estar reservado dentro de un esquema.

+19

"no se puede utilizar sin codificar": ... para un propósito que no sea su significado especial. La respuesta correcta a la pregunta es "Sí, es legal tener un punto y coma en una URL", pero la impresión que obtengo de esta respuesta (no la cita de la especificación, sino el resumen) es "No, un punto y coma no codificado no puede ser utilizado en una URL ". – Miles

+0

@Miles editado para aclarar – Greg

+0

Llego tarde a la fiesta, pero este código trata explícitamente de las URL http/https, lo que permite; como el separador de cadenas de consulta (en lugar de &) ... en realidad, Ben ya lo cubrió. – Powerlord

5

http://www.ietf.org/rfc/rfc3986.txt cubre las URL y qué caracteres pueden aparecer en forma no codificada. Dado que las URL que contienen punto y coma funcionan correctamente en los navegadores, su código debería ser compatible.

11

El punto y coma es un carácter URI legal; pertenece a la categoría de sub-delimitador: http://www.ietf.org/rfc/rfc3986.txt

Sin embargo, la especificación establece que si la semi-color es legítimo que un específica URI o no depende del esquema o productor de que URI. Entonces, si el sitio que usa esos enlaces no permite puntos y comas, entonces no son válidos para ese caso en particular.

23

El W3C anima a los programas CGI a aceptar; así como & en cadenas de consulta (es decir, tratar ?name=fred&age=50 y de la misma manera). Esto se supone que es porque & tiene que codificarse como & amp; en HTML, mientras que; no.

+1

El aliento del W3C parece estar principalmente aquí ...http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#hB.2.2 –

1

Citar RFC no es tan útil para responder a esta pregunta, porque encontrará URL con punto y coma (y comas para el caso). Teníamos un Regex que no manejaba puntos y comas, y algunos de nuestros usuarios en NutshellMail se quejaron porque las URL que los contienen existen de hecho en la naturaleza. Intenta construir una URL ficticia en Facebook o Twitter que contenga un ';' o ',' y verá que esos dos servicios codifican la URL completa correctamente.

que sustituirá la expresión regular que utilizábamos con el siguiente patrón (y han probado que funciona):

string regex = @"((www\.|(http|https|ftp|news|file)+\:\/\/)[&#95;.a-zA-Z0-9-]+\.[a-zA-Z0-9\/&#95;:@=.+?,##%&~_-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])"; 

Esta expresión regular vino de http://rickyrosario.com/blog/converting-a-url-into-a-link-in-csharp-using-regular-expressions/ (con una ligera modificación)

+3

Agregué el formato del código para poder leerlo más fácilmente, pero no recomiendo usarlo regex Dejando de lado la obvia transformación de la red y las numerosas pestañas invertidas y tuberías redundantes, las dos últimas clases de caracteres son muy defectuosas. No solo excluyen caracteres válidos como punto y coma y paréntesis, sino que el último coincide con todos los tipos de caracteres * inválidos como comillas, llaves y caracteres que no son ASCII. –

4

Sí, punto y coma son válido en URLs Sin embargo, si los está sacando de la prosa relativamente no estructurada, probablemente sea seguro asumir que un punto y coma en el final de una URL se entiende como puntuación de oraciones. Lo mismo ocurre con otros caracteres de puntuación de oraciones como puntos, signos de interrogación, citas, etc.

Si solo está interesado en las URL con un protocolo explícito http[s], y su sabor regex admite lookbehinds, esta expresión regular debería ser suficiente:

https?://[\w!#$%&'()*+,./:;[email protected]\[\]-]+(?<![!,.?;:"'()-])

Después del protocolo, simplemente se refiere a uno o más caracteres que pueden ser válidas en una URL, sin tener que preocuparse acerca de la estructura en absoluto. Pero luego retrocede tantas posiciones como sea necesario hasta que el carácter final no sea algo que pueda ser una puntuación de oraciones.

6

Técnicamente, un punto y coma es un sub-delimitador legal en una cadena de URL; un montón de material de origen se cita más arriba, incluido http://www.ietf.org/rfc/rfc3986.txt.

Y algunos lo usan con fines legítimos, aunque su uso es probable que sea específico del sitio (es decir, solo para usar con ese sitio) porque su uso debe ser definido por el sitio que lo usa.

En el mundo real, sin embargo, el uso principal de los puntos y comas en las URL es ocultar un virus o una URL de suplantación de identidad detrás de una URL legítima.

Por ejemplo, enviar a alguien un correo electrónico con este enlace:

http: // www.yahoo.com/junk/nonsense;0200.0xfe.0x37.0xbf/malicious_file/

dará lugar a la Yahoo! se ignora el enlace (www.yahoo.com/junk/nonsense) porque, aunque es legítimo (es decir, está formado correctamente), no existe dicha página. Pero el segundo enlace (0200.0xfe.0x37.0xbf/malicious_file /) presumiblemente existe * y el usuario será dirigido a la página de archivo malicioso; con lo cual el gerente de TI corporativo recibirá un informe y es probable que obtenga un recibo de color rosa.

Y antes de que todos los que no dicen se desanimen, así es exactamente como funciona el nuevo problema de phishing de Facebook. Los nombres han sido cambiados para proteger a los culpables como de costumbre.

* No existe tal página en realidad, que yo sepa. El enlace que se muestra es solo para fines de esta discusión.

+2

¿Qué aplicación abre '0200.0xfe.0x37.0xbf' porque sabe que el enlace yahoo devolverá un estado 404? No tiene sentido para mí. – mgutt

Cuestiones relacionadas