2009-07-24 23 views
27

Sto utilizzando un'espressione regolare per convertire l'URL di testo semplice in collegamenti selezionabili.Un URL può contenere un punto e virgola?

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

Tuttavia, a volte nel corpo del testo, URL sono enumerati uno per riga con una virgola alla fine. L'URL reale non contiene alcun ";".

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 

è permesso di avere un punto e virgola (;) in un URL oppure può essere il punto e virgola considerato un indicatore della fine di un URL? Come si adatterebbe alla mia espressione regolare?

risposta

35

A semicolon is reserved e non può essere utilizzato non codificato tranne per il suo scopo speciale (che dipende dallo schema). Sezione 2.2:

Molti schemi URL riservano certi caratteri per un significato speciale: la loro comparsa nella parte regime specifico del URL ha un semantica designati. Se il carattere corrispondente a un ottetto è riservato in uno schema, l'ottetto deve essere codificato . I caratteri ";", "/", "?", ":", "@", "=" E "&" sono i caratteri che possono essere riservati per un significato speciale all'interno di uno schema . Nessun altro carattere può essere riservato all'interno di uno schema.

+19

"non può essere utilizzato non codificato": ... per uno scopo diverso dal suo significato speciale. La risposta corretta alla domanda è "Sì, è legale avere un punto e virgola in un URL", ma l'impressione che ottengo da questa risposta (non dalla citazione spec, ma dal sommario) è "No, un punto e virgola non codificato potrebbe non essere usato in un URL. " – Miles

+0

@Miles modificato per chiarire – Greg

+0

Sono in ritardo per la festa, ma questo codice riguarda esplicitamente gli URL http/https, cosa che consente; come separatore stringa di query (invece di &) ... in realtà, Ben lo ha già trattato. – Powerlord

5

http://www.ietf.org/rfc/rfc3986.txt copre gli URL e quali caratteri possono essere visualizzati in forma non codificata. Dato che gli URL che contengono il punto e virgola funzionano correttamente nei browser, il tuo codice dovrebbe supportarli.

11

Il punto e virgola è un carattere URI legale; appartiene alla categoria sub-delimitatore: http://www.ietf.org/rfc/rfc3986.txt

Tuttavia, la specifica afferma che se il semi-colore legittimo per uno specifico URI o non dipende dal regime o produttore di detto URI. Pertanto, se il sito che utilizza tali collegamenti non consente il punto e virgola, non sono validi per quel particolare caso.

23

Il W3C incoraggia i programmi CGI ad accettare; nonché & in stringhe di query (ad esempio, trattamento ?name=fred&age=50 e ?name=fred;age=50 allo stesso modo). Questo dovrebbe essere perché & deve essere codificato come & amp; in HTML considerando; non lo fa.

+1

L'incoraggiamento del W3C sembra essere principalmente qui ...http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#hB.2.2 –

1

Non è molto utile citare le RFC per rispondere a questa domanda, perché incontrerete URL con punto e virgola (e virgole per quella questione). Avevamo un Regex che non gestiva le virgole e le virgole e alcuni dei nostri utenti di NutshellMail si sono lamentati perché gli URL che li contengono effettivamente esistono in natura. Prova a creare un URL fittizio su Facebook o Twitter che contiene un ';' o "," e vedrai che questi due servizi codificano correttamente l'intero URL.

ho sostituito il Regex stavamo usando con il seguente schema (e hanno testato che funziona):

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

Questo Regex è venuto da http://rickyrosario.com/blog/converting-a-url-into-a-link-in-csharp-using-regular-expressions/ (con una leggera modifica)

+3

Ho aggiunto la formattazione del codice in modo da poterlo leggere più facilmente, ma non è consigliabile utilizzarlo regex. Lasciando da parte l'ovvia maneggevolezza del web e le molte barre e pipe ridondanti, le ultime due classi di personaggi sono seriamente imperfette. Non solo escludono caratteri validi come il punto e virgola e le parentesi, che ultimo corrisponde a tutti i tipi di caratteri * non validi * come virgolette, parentesi e caratteri non ASCII. –

4

Sì, punti e virgola sono valido negli URL. Tuttavia, se li stai strappando da una prosa relativamente poco strutturata, è probabilmente sicuro assumere un punto e virgola alla fine di un URL inteso come punteggiatura della frase. Lo stesso vale per altri caratteri di punteggiatura come periodi, punti interrogativi, citazioni, ecc.

Se ti interessano solo gli URL con un esplicito protocollo http[s] e il tuo suffisso di espressioni regolari supporta le schermate, questa espressione regolare dovrebbe essere sufficiente:

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

Dopo il protocollo, corrisponde semplicemente uno o più caratteri che possono essere valide in un URL, senza preoccuparsi di struttura a tutti. Ma poi si spegne tutte le posizioni necessarie fino a quando il carattere finale non è qualcosa che potrebbe essere la punteggiatura della frase.

6

Tecnicamente, un punto e virgola è un sotto-delimitatore legale in una stringa URL; un sacco di materiale di partenza è quotato sopra, incluso http://www.ietf.org/rfc/rfc3986.txt.

E alcuni lo usano per scopi legittimi anche se il suo utilizzo è probabilmente specifico del sito (cioè, solo per l'uso con quel sito) perché il suo utilizzo deve essere definito dal sito che lo utilizza.

Nel mondo reale, tuttavia, l'uso principale dei punti e virgola negli URL è nascondere un URL di virus o phishing dietro un URL legittimo.

Per esempio, inviando una e-mail a qualcuno con questo link:

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

si tradurrà in Yahoo! link (www.yahoo.com/junk/nonsense) viene ignorato perché anche se è legittimo (cioè formato correttamente) non esiste una tale pagina. Ma il secondo link (0200.0xfe.0x37.0xbf/malicious_file /) esiste presumibilmente * e l'utente verrà indirizzato alla pagina del file malicious_file; al che il proprio responsabile IT aziendale otterrà un report e uno probabilmente otterrà una scivolata rosa.

E prima che tutti i nay-sayer si tirino su, questo è esattamente come funziona il nuovo problema di phishing di Facebook. I nomi sono stati cambiati per proteggere i colpevoli come al solito.

* Nessuna di queste pagine esiste in realtà per quanto ne so. Il collegamento mostrato è solo per gli scopi di questa discussione.

+2

Quale app apre '0200.0xfe.0x37.0xbf' perché sa che il link yahoo restituirà uno stato 404 ?! Non ha senso per me. – mgutt

Problemi correlati