Une URL peut-elle contenir un point-virgule?
J'utilise une expression régulière pour convertir L'URL de texte brut en liens cliquables.
@(https?://([-w.]+)+(:d+)?(/([w/_.-]*(?S+)?)?)?)@
Cependant, parfois dans le corps du texte, les URL sont énumérées une par ligne avec un point-virgule à la fin. L'URL réelle ne contient aucun";".
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-il permis d'avoir un point-virgule (;) dans une URL ou le point-virgule Peut-il être considéré comme un marqueur de la fin d'une URL? Comment cela cadrerait-il dans mon expression régulière?
7 réponses
Un point-virgule est réservé et ne peut être utilisé non codé sauf pour son usage spécial (qui dépend du schéma). Section 2.2:
De nombreux schémas D'URL réservent certains caractères pour une signification particulière: leur apparition dans l' la partie spécifique au schéma de L'URL a un sémantique désignée. Si le personnage correspondant à un octet est réservé dans un schéma, l'octet doit être codé. Caractère ";", "/", "?", ":", "@", "=" et "&" sont le les caractères qui peuvent être réservé à une signification particulière dans un régime. Aucun autre caractère ne peut être réservé dans un régime.
Le W3C encourage les programmes CGI à accepter ; ainsi que & dans les chaînes de requête (c'est-à-dire traiter ?name=fred&age=50
et ?name=fred;age=50
de la même manière). Ceci est supposé être parce que & doit être encodé en tant que & en HTML alors que ; ne le fait pas.
Le point-virgule est un caractère URI légal; il appartient à la catégorie des sous-délimiteurs: http://www.ietf.org/rfc/rfc3986.txt
Cependant, la spécification indique que si la semi-couleur est légitime pour un URI spécifique dépend ou non du schéma ou du producteur de cet URI. Donc, si le site utilisant ces liens n'autorise pas les points-virgules, ils ne sont pas valides pour ce cas particulier.
Techniquement, un point-virgule est un sous-délimiteur légal dans une chaîne D'URL; beaucoup de matériel source est cité ci-dessus, y compris http://www.ietf.org/rfc/rfc3986.txt .
Et certains l'utilisent à des fins légitimes, bien que son utilisation soit probablement spécifique au site (c'est-à-dire uniquement pour être utilisée avec ce site), car son utilisation doit être définie par le site qui l'utilise.
Dans le monde réel, cependant, l'utilisation principale des points-virgules dans les URL est de cacher un virus ou une URL de phishing derrière un URL.
Par exemple, envoyer un e-mail à quelqu'un avec ce lien:
Http: / / www.yahoo.com/junk/nonsense;0200.0 xfe. 0x37. 0xbf / malicious_file /
Se traduira par le Yahoo! lien (www.yahoo.com/junk/nonsense) étant ignoré parce que même si elle est légitime (c'est-à-dire correctement formée) aucune telle page n'existe. Mais le deuxième lien (0200.0 xfe.0x37. 0xbf/ malicious_file/) existe vraisemblablement* et l'Utilisateur sera dirigé vers la page malicious_file; après quoi son responsable informatique d'entreprise obtenez un rapport et on obtiendra probablement un feuillet rose.
Et avant que tous les non-sayers obtiennent leurs squames, c'est exactement comment fonctionne le nouveau problème de phishing Facebook. Les noms ont été changés pour protéger les coupables, comme d'habitude.
*Aucune page de ce type n'existe réellement à ma connaissance. Le lien affiché est uniquement à des fins de cette discussion.
Http://www.ietf.org/rfc/rfc3986.txt couvre les URL et les caractères qui peuvent apparaître sous forme non codée. Étant donné que les URL contenant des points-virgules fonctionnent correctement dans les navigateurs, votre code doit les prendre en charge.
Oui, les points-virgules sont valides dans les URL. Cependant, si vous les arrachez à partir de prose relativement non structurée, il est probablement prudent de supposer qu'un point-virgule à la fin D'une URL est censé être la ponctuation de la phrase. Il en va de même pour les autres caractères de ponctuation de phrase comme les points, les points d'interrogation, les guillemets, etc..
Si vous n'êtes intéressé que par les URL avec un protocole http[s]
explicite, et que votre saveur regex prend en charge lookbehinds, cette regex devrait il suffit:
https?://[\w!#$%&'()*+,./:;=?@\[\]-]+(?<![!,.?;:"'()-])
Après le protocole, il correspond simplement à un ou plusieurs caractères qui peuvent être valides dans une URL, sans se soucier de la structure du tout. Mais alors il recule autant de positions que nécessaire jusqu'à ce que le caractère final ne soit pas quelque chose qui pourrait être la ponctuation de la phrase.
Citer des RFC n'est pas très utile pour répondre à cette question, car vous rencontrerez des URL avec des points-virgules (et des virgules d'ailleurs). Nous avions une expression rationnelle qui ne gérait pas les points-virgules et les virgules, et certains de nos utilisateurs de NutshellMail se sont plaints parce que les URL les contenant existent en fait dans la nature. Essayez de créer une URL factice dans Facebook ou Twitter qui contient un'; ' ou ', ' et vous verrez que ces deux services encodent correctement l'URL complète.
J'ai remplacé le Regex nous utilisaient avec le modèle suivant (et ont testé que cela fonctionne):
string regex = @"((www\.|(http|https|ftp|news|file)+\:\/\/)[_.a-zA-Z0-9-]+\.[a-zA-Z0-9\/_:@=.+?,##%&~_-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])";
Cette expression venait de http://rickyrosario.com/blog/converting-a-url-into-a-link-in-csharp-using-regular-expressions/ (avec une légère modification)