2009-09-11 9 views

risposta

19

La sintassi URL reale è piuttosto complicato e non facile da rappresentare in regex. La maggior parte dei regex dall'aspetto semplice fornirà molti falsi negativi e falsi positivi. Vedere per divertimento these efforts ma anche il risultato finale non è buono.

Inoltre in questi giorni si sarebbe generalmente desidera consentire IRI così come vecchia scuola URI, in modo che possiamo creare un collegamento a indirizzi validi come:

http://en.wikipedia.org/wiki/Þ 
http://例え.テスト/ 

andrei solo per semplici controlli: ha inizio con un metodo ben noto: nome? È privo di spazi e doppi apici? Se è così allora, probabilmente è abbastanza buono.

+2

Ok. Almeno ora so che probabilmente non ne vale la pena nella maggior parte dei casi:] Grazie. –

+3

/(ftp | https?): \/\/[^ "] + $/ –

+1

In effetti, il modo corretto per convalidare gli URL non è quello di utilizzare un'espressione regolare. Controlla il [codice di convalida dell'URI in Node.js] (https://github.com/joyent/node/blob/master/lib/url.js). È molto più complesso di una regexp, motivo per cui è sempre meglio usare una libreria specializzata piuttosto che eseguire la propria espressione regolare. –

-1

Prova questa regex, funziona per me:

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

mi piacerebbe essere sicuri che non voglio entrare falsi negativi con questo regex. Non hai avuto problemi con esso? –

+1

Nessun problema ancora. Perché non condurre test sui falsi positivi che anticipi? – ennuikiller

+1

Si * dare * un falso negativo per simboli come ';' nella query, * tranne * che è un grande grande '\ S +' nel mezzo dell'espressione che può espandersi per adattarsi a qualsiasi cosa, e non è ancorato alla fine in modo da poter inserire qualsiasi assurdità finale. es. 'Http: // @' o 'http: // Ho un bel mucchio di "noci di cocco"' sono 'validi'. – bobince

14

Prova questa regex

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

E funziona meglio per me.

+1

Penso che è la migliore espressione regolare per la convalida dell'url –

+1

Questo non funziona per i seguenti URL: www.google.com, gogl.com, http: //google.clo, www.google.co.in, www.goo.com.in.ssd –

+1

Questo codice non funzionerà per molti URL. Quando si individuano gli URL, è meglio fare affidamento su una libreria specializzata. y] (http://stackoverflow.com/a/21925491/1269037). –

34

Nel accepted answerbobince risolto correttamente: la convalida del solo nome schema,: //, e spazi e doppi apici è in genere sufficiente. Ecco come la convalida può essere implementato in JavaScript:

var url = 'http://www.google.com'; 
var valid = /^(ftp|http|https):\/\/[^ "]+$/.test(url); 
// true 

o

var r = /^(ftp|http|https):\/\/[^ "]+$/; 
r.test('http://www.goo le.com'); 
// false 

o

var url = 'http:www.google.com'; 
var r = new RegExp('/^(ftp|http|https):\/\/[^ "]+$/'); 
r.test(url); 
// false 

Riferimenti per la sintassi:

+6

-1 per il collegamento w3schools –

+5

@DerekHenderson Ecco qua, W3Schools hater;) –

+21

+1 per ottenere un -1 non necessario per l'odio di W3Schools. – MaxArt

2
<html> 
<head> 
<title>URL</title> 
<script type="text/javascript"> 
    function validate() { 
     var url = document.getElementById("url").value; 
     var pattern = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; 
     if (pattern.test(url)) { 
      alert("Url is valid"); 
      return true; 
     } 
      alert("Url is not valid!"); 
      return false; 

    } 
</script> 

</head> 
<body> 
URL : 
<input type="text" name="url" id="url" /> 
<input type="submit" value="Check" onclick="validate();" /> 
</body> 
</html> 
+0

Questo codice non funzionerà per molti URL. Quando si convalidano gli URL, è meglio fare affidamento su una libreria specializzata. [Ecco perché] (http://stackoverflow.com/a/21925491/1269037). –

+0

L'utilizzo di JavaScript puro è l'opzione migliore per le convalide se si desidera personalizzare il modello è possibile farlo facilmente nel modello. – Swapnil

0

Io uso il/^ [a-z] + [^:] + $/i delle espressioni regolari per la convalida degli URL. Guarda un esempio del mio codice cross-browser InputKeyFilter con convalida URL.

<!doctype html> 
 
<html xmlns="http://www.w3.org/1999/xhtml" > 
 
<head> 
 
    <title>Input Key Filter Test</title> 
 
\t <meta name="author" content="Andrej Hristoliubov [email protected]"> 
 
\t <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
 
\t 
 
\t <!-- For compatibility of IE browser with audio element in the beep() function. 
 
\t https://www.modern.ie/en-us/performance/how-to-use-x-ua-compatible --> 
 
\t <meta http-equiv="X-UA-Compatible" content="IE=9"/> 
 
\t 
 
\t <link rel="stylesheet" href="https://rawgit.com/anhr/InputKeyFilter/master/InputKeyFilter.css" type="text/css"> \t \t 
 
\t <script type="text/javascript" src="https://rawgit.com/anhr/InputKeyFilter/master/Common.js"></script> 
 
\t <script type="text/javascript" src="https://rawgit.com/anhr/InputKeyFilter/master/InputKeyFilter.js"></script> 
 
\t 
 
</head> 
 
<body> 
 
URL: 
 
<input type="url" id="Url" value=":"/> 
 
<script> 
 
\t CreateUrlFilter("Url", function(event){//onChange event 
 
\t \t \t inputKeyFilter.RemoveMyTooltip(); 
 
\t \t \t var elementNewInteger = document.getElementById("NewUrl"); 
 
\t \t \t elementNewInteger.innerHTML = this.value; 
 
\t \t } 
 
\t \t 
 
\t \t //onblur event. Use this function if you want set focus to the input element again if input value is NaN. (empty or invalid) 
 
\t \t , function(event){ this.ikf.customFilter(this); } 
 
\t); 
 
</script> 
 
New URL: <span id="NewUrl"></span> 
 

 
</body> 
 
</html>

vedere anche la mia pagina example of the input key filter.

+0

Non funziona. Segnala questo valido. h: //google.com –

+0

h: //google.com è un URL valido. "h:" è prefisso valido Vedere https://www.w3.org/Addressing/URL/url-spec.txt per i dettagli. Esempi di URL valido: mailto: [email protected] https://google.com Se si desidera filtrare solo Hypertext Transfer Protocol, è necessario utilizzare/^ http: \/\/[^:] + $/i espressione regolare – Andrej

0

prova con questo:

var RegExp =/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)[email protected])?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/i; 
0
/(?:http[s]?\/\/)?(?:[\w\-]+(?::[\w\-]+)[email protected])?(?:[\w\-]+\.)+(?:[a-z]{2,4})(?::[0-9]+)?(?:\/[\w\-\.%]+)*(?:\?(?:[\w\-\.%]+=[\w\-\.%!]+&?)+)?(#\w+\-\.%!)?/ 
+0

Penso che la tua espressione manchi un ':' tra il protocollo e '//'. Altrimenti, funziona bene! –

-2

Dopo una lunga ricerca ho costruito questa espressione reg. Spero che aiuti anche gli altri .......

url = 'https://google.co.in'; 
var re = /[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?$/; 
if (!re.test(url)) { 
alert("url error"); 
return false; 
}else{ 
alert('success') 
} 
+0

I downvoters spiegano il motivo del downvoting – Aamir

0

Ho trovato un certo successo con questo:

/^((ftp|http|https):\/\/)?www\.([A-z]+)\.([A-z]{2,})/ 
  • controlla uno o nessuno dei seguenti: ftp: //, http: // o https: //
  • Richiede www.
  • Controlla qualsiasi numero di caratteri validi.
  • Infine, controlla che abbia un dominio e che il dominio sia di almeno 2 caratteri.

ovviamente non è perfetto, ma è gestita miei casi abbastanza bene

0

Prova questo funziona per me:

/^(http[s]?:\/\/){0,1}(w{3,3}\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/; 
Problemi correlati