717 Stimmen

Was ist ein guter regulärer Ausdruck, um eine URL abzugleichen?

Derzeit habe ich ein Eingabefeld, das die URL erkennt und die Daten auswertet.

Im Moment verwende ich also:

var urlR = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)
           (?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url= content.match(urlR);

Das Problem ist, wenn ich eine URL eingebe wie www.google.com Es funktioniert nicht. Wenn ich eingebe http://www.google.com funktioniert es.

Ich kenne mich mit regulären Ausdrücken nicht besonders gut aus. Kann mir jemand helfen?

2 Stimmen

John Gruber's Liberales, genaues Regex-Muster zum Abgleich von URLs ist auch gut. Siehe diese SO-Frage wie man sie für die Arbeit in Javascript modifiziert.

0 Stimmen

"/(http|ftp|https):\/\/[ \w -]+( \. [ \w -]+)+([ \w. ,@?^=%&:\/~+#-]*[ \w @?^=%&\/~+#-])?/"

0 Stimmen

Dies ist für Duplikat markiert, aber diese Frage ist für js fragen und die andere Frage ist nicht für eine js-Lösung fragen

1016voto

Daveo Punkte 17512

Regex, wenn Sie sicherstellen wollen, dass die URL mit HTTP/HTTPS beginnt:

https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)

Wenn Sie das HTTP-Protokoll nicht benötigen:

[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)

Um dies auszuprobieren, siehe http://regexr.com?37i6s oder für eine weniger restriktive Version http://regexr.com/3e6m0 .

Beispiel für eine JavaScript-Implementierung:

var expression = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)?/gi;
var regex = new RegExp(expression);
var t = 'www.google.com';

if (t.match(regex)) {
  alert("Successful match");
} else {
  alert("No match");
}

394voto

foufos Punkte 3773
(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})

Entspricht den folgenden Fällen

  • http://www.foufos.gr
  • https://www.foufos.gr
  • http://foufos.gr
  • http://www.foufos.gr/kino
  • http://werer.gr
  • www.foufos.gr
  • www.mp3.com
  • www.t.co
  • http://t.co
  • http://www.t.co
  • https://www.t.co
  • www.aa.com
  • http://aa.com
  • http://www.aa.com
  • https://www.aa.com

Passt NICHT zu den folgenden Punkten

Prüfen Sie es in rubular - NEUE Version

Prüfen Sie es in rubular - alte Version

65voto

Michael Connor Punkte 3972

Dies sind die Droiden, die du suchst. Dies ist ein Auszug aus validator.js welche die Bibliothek ist, die Sie wirklich verwenden sollten, um dies zu tun. Aber wenn Sie Ihr eigenes Programm erstellen wollen, wer bin ich, um Sie davon abzuhalten? Wenn Sie reine Regex wollen, dann können Sie einfach die Längenprüfung herausnehmen. Ich denke, es ist eine gute Idee, die Länge der URL zu testen, wenn Sie wirklich wollen, um die Einhaltung der Spezifikation zu bestimmen.

 function isURL(str) {
     var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-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,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$';
     var url = new RegExp(urlRegex, 'i');
     return str.length < 2083 && url.test(str);
}

Test:

function isURL(str) {
         var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-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,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$';
         var url = new RegExp(urlRegex, 'i');
         return str.length < 2083 && url.test(str);
    }
var check = [
  'http://www.foufos.gr',
  'https://www.foufos.gr',
  'http://foufos.gr',
  'http://www.foufos.gr/kino',
  'http://werer.gr',
  'www.foufos.gr',
  'www.mp3.com',
  'www.t.co',
  'http://t.co',
  'http://www.t.co',
  'https://www.t.co',
  'www.aa.com',
  'http://aa.com',
  'http://www.aa.com',
  'https://www.aa.com',
  'www.foufos',
  'www.foufos-.gr',
  'www.-foufos.gr',
  'foufos.gr',
  'http://www.foufos',
  'http://foufos',
  'www.mp3#.com'
];

for (let index = 0; index < check.length; index++) {
var url=check[index]
  if  (isURL(check[index]))
    console.log(`${url}         `);
else{
  console.log(`${url}          `);
}

}

Ergebnis enter image description here

47voto

Amar Palsapure Punkte 9472

Eine weitere mögliche Lösung, oben Lösung fehlgeschlagen für mich in Parsing Query String Params.

var regex = new RegExp("^(http[s]?:\\/\\/(www\\.)?|ftp:\\/\\/(www\\.)?|www\\.){1}([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?");

if(regex.test("http://google.com")){
  alert("Successful match");
}else{
  alert("No match");
}

In dieser Lösung können Sie Folgendes ändern [-0-9A-Za-z\.@:%_\+~#= um den Namen der Domäne/Subdomäne anzupassen. Bei dieser Lösung werden auch die Abfrage-String-Parameter berücksichtigt.

Wenn Sie nicht mit RegEx , dann aus dem Ausdruck ersetzen \\ von \ .

Ich hoffe, das hilft.

Prüfung:-

function IsUrl(url){
    var regex = new RegExp("^(http[s]?:\\/\\/(www\\.)?|ftp:\\/\\/(www\\.)?|www\\.){1}([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?");

if(regex.test(url)){
  console.log(`${url}         `);
}else{
  console.log(`${url}          `);
}}
var check = [
  'http://www.foufos.gr',
  'https://www.foufos.gr',
  'http://foufos.gr',
  'http://www.foufos.gr/kino',
  'http://werer.gr',
  'www.foufos.gr',
  'www.mp3.com',
  'www.t.co',
  'http://t.co',
  'http://www.t.co',
  'https://www.t.co',
  'www.aa.com',
  'http://aa.com',
  'http://www.aa.com',
  'https://www.aa.com',
  'www.foufos',
  'www.foufos-.gr',
  'www.-foufos.gr',
  'foufos.gr',
  'http://www.foufos',
  'http://foufos',
  'www.mp3#.com'
];
for (let index = 0; index < check.length; index++) {
    IsUrl(check[index])
}

Ergebnis

enter image description here

4voto

Eric Heikkinen Punkte 61

Ich habe versucht, ein JavaScript zu erstellen, um einen Domänennamen (z. B. google.com) zu validieren und bei Validierung eine Schaltfläche zum Senden zu aktivieren. Ich dachte, dass ich meinen Code für diejenigen, die suchen, um etwas ähnliches zu erreichen teilen würde. Das Skript erwartet eine Domäne ohne den Wert http:// oder www. Das Skript verwendet einen reduzierten regulären Ausdruck von oben für den Domainabgleich, der nicht streng auf gefälschte TLDs achtet.

http://jsfiddle.net/nMVDS/1/

$(function () {
  $('#whitelist_add').keyup(function () {
    if ($(this).val() == '') { //Check to see if there is any text entered
        //If there is no text within the input, disable the button
        $('.whitelistCheck').attr('disabled', 'disabled');
    } else {
        // Domain name regular expression
        var regex = new RegExp("^([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?");
        if (regex.test($(this).val())) {
            // Domain looks OK
            //alert("Successful match");
            $('.whitelistCheck').removeAttr('disabled');
        } else {
            // Domain is NOT OK
            //alert("No match");
            $('.whitelistCheck').attr('disabled', 'disabled');
        }
    }
  });
});

HTML FORM:

<form action="domain_management.php" method="get">
    <input type="text" name="whitelist_add" id="whitelist_add" placeholder="domain.com">
    <button type="submit" class="btn btn-success whitelistCheck" disabled='disabled'>Add to Whitelist</button>
</form>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X