2010-08-03 17 views
5

Ho una convalida URL di base nella mia domanda. In questo momento sto usando il seguente codice.Convalida URL - Accetta URL senza protocolli

//validates whether the given value is 
//a valid URL 
function validateUrl(value) 
{ 
    var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ 
    return regexp.test(value); 
} 

Ma al momento non accetta gli URL senza il protocollo. Per es. se fornisco www.google.com non lo accetta. Come posso modificare RegEx per far sì che accetti URL senza protocollo? Protocollo

+0

Grazie per tutte le vostre risposte. Ha funzionato alla grande – NLV

+0

Tutti i tuoi Regex accetteranno @@ ## $$ come URL valido. Qualche idea? – NLV

+0

NLV, non hai specificato che volevi che correggessimo la tua espressione regolare, hai appena chiesto come cambiarlo per accettare qualsiasi protocollo. In ogni caso, vedere la mia nuova risposta di seguito che fornisce una regex completa (e complessa) di convalida dell'URL. –

risposta

5

Ecco una grande espressione regolare lungo per corrispondenza di un URL:

(?i)\b((?:(?:[a-z][\w-]+:)?(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])) 

La versione estesa di quella (per contribuire a rendere più comprensibile):

(?xi) 
\b 
(       # Capture 1: entire matched URL 
    (?: 
    (?:[a-z][\w-]+:)?    # URL protocol and colon 
    (?: 
     /{1,3}      # 1-3 slashes 
     |        # or 
     [a-z0-9%]      # Single letter or digit or '%' 
            # (Trying not to match e.g. "URI::Escape") 
    ) 
    |       # or 
    www\d{0,3}[.]    # "www.", "www1.", "www2." … "www999." 
    |       # or 
    [a-z0-9.\-]+[.][a-z]{2,4}/ # looks like domain name followed by a slash 
) 
    (?:       # One or more: 
    [^\s()<>]+      # Run of non-space, non-()<> 
    |        # or 
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels 
)+ 
    (?:       # End with: 
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels 
    |         # or 
    [^\s`!()\[\]{};:'".,<>?«»“”‘’]  # not a space or one of these punct chars 
) 
) 

Questi entrambi provengono da this page, ma leggermente modificato per rendere il protocollo opportunamente facoltativo - dovresti leggere quella pagina per aiutarti a capire cosa sta facendo, e ha anche una variante che corrisponde solo agli URL basati sul web, che potresti voler dare un'occhiata anche tu.

+0

Grazie per il vostro impegno. Fammi fare un controllo su di esso. – NLV

+2

errori nella console cromata –

1

Fai opzionale con (...)?

/(((ftp|http|https):\/\/)|(\/\/))?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ 
+0

Sposta ftp/http/https al gruppo 2 e non accetta URL '// server'. –

+0

Guarda la mia modifica - ora accetta 'protocollo: //' o '//' o nessuno di essi. – hsz

+0

Inoltre puoi usare '(?: ...)' per escludere il gruppo dai risultati. – hsz

1

Cambiare la regex per:

/((ftp|http|https):\/\/)?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ 
+0

Come con la risposta di hsz, sposta il ftp/http/https al gruppo 2 e non accetta gli URL di '// server'. –

1

Io non sono un esperto espressione regolare, ma che circonda il protocollo con un altro staffa e con un punto interrogativo alla fine dovrebbe renderlo facoltativo:

function validateUrl(value) 
{ 
    var regexp = /((ftp|http|https):\/\/)?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ 
    return regexp.test(value); 
} 
+0

Ancora, se questa regex è stata usata per catturare parti di URL, sta creando gruppi non necessari, e sta combinando in modo errato '//' con il protocollo, che esclude gli URL validi. –

+0

Sebbene //google.com funzioni, non è un URL valido e non penso che la maggior parte della gente sa che funzionerebbe e quindi può essere molto utile escludere tali URL dalla convalida. Non perché sia ​​possibile, deve essere valido in ogni forma. Le doppie barre sono solo in mezzo mentre i punti sono tra sottodominio, dominio o TLD. – 2ndkauboy

+0

Le doppie barre sono il prefisso del percorso, mentre i due punti sono il separatore con il protocollo - sono due parti distinte che si verificano solo insieme. (Questo è dettagliato in "3. Componenti sintattici URI" di RFC 2396) L'utilizzo di //google.com è un Url relativo valido (di nuovo, vedere l'appendice "C.1 Esempi normali" di RFC 2396) e si verifica "nella natura selvaggia". –

0

Modificare la prima parte in:

(?:(ftp|http|https):)?(?:\/\/)? 

Il contenuto (?: ... ) gruppo volontà senza l'utilizzo di gruppi di cattura (in modo che il protocollo attuale rimane in primo gruppo).

Nota come le parti protocol: e // sono singolarmente opzionali, poiché //www.google.com è un URL (relativo) valido.

+0

I due punti non dipendono dal protocollo: http://tools.ietf.org/html/rfc2396 – 2ndkauboy

+0

Non è chiaro cosa stai dicendo lì, e questo è un lungo documento - puoi fare riferimento alla sezione specifica a cui ti riferisci a? Ho provato (ad esempio) ': // google.com' in Chrome e IE e non funziona, anche se sembra che Firefox lo accetti. –

+0

La serie di schemi include solo il nome del protocollo (come "http", "ftp") ma non i due punti. Quindi anche la tua espressione regolare non divide tutti i gruppi correttamente. Tuttavia, poiché NLV voleva solo una regex di convalida per un URL valido e comune (e non solo funzionante), non è necessario utilizzare un gruppo attorno alle barre. – 2ndkauboy

-1

è possibile convalidare sotto url per favore ..

http://www.youtube.com/http://www.youtube.com/watch?v=awP_PCb67Kk

+1

Si noti che [risposte solo per collegamento] (http://meta.stackoverflow.com/tags/link-only-answers/info) sono scoraggiate, pertanto le risposte dovrebbero essere il punto finale di una ricerca per una soluzione (rispetto a un'altra sosta di riferimenti, che tendono a diventare obsoleti nel tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra