พยายามตรวจสอบ URL โดยใช้ JavaScript


84

ฉันต้องการตรวจสอบความถูกต้องของ URL และข้อความที่แสดง ด้านล่างนี้คือรหัสของฉัน:

$("#pageUrl").keydown(function(){
        $(".status").show();
        var url = $("#pageUrl").val();

        if(isValidURL(url)){

        $.ajax({
            type: "POST",
            url: "demo.php",
            data: "pageUrl="+ url,
            success: function(msg){
                if(msg == 1 ){
                    $(".status").html('<img src="images/success.gif"/><span><strong>SiteID:</strong>12345678901234456</span>');
                }else{
                    $(".status").html('<img src="images/failure.gif"/>');
                }
            }
            });

            }else{

                    $(".status").html('<img src="images/failure.gif"/>');
            }

    });


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

    if(RegExp.test(url)){
        return true;
    }else{
        return false;
    }
} 

ปัญหาของฉันคือตอนนี้มันจะแสดงข้อความแสดงข้อผิดพลาดแม้ว่าจะป้อน URL ที่ถูกต้องจนกว่าจะตรงกับนิพจน์ทั่วไปและจะส่งคืนจริงแม้ว่า URL จะเป็นอย่าง"http://wwww"นั้นก็ตาม

ฉันขอขอบคุณข้อเสนอแนะของคุณ


3
อย่าลืมเพิ่มการตรวจสอบฝั่งเซิร์ฟเวอร์เนื่องจากการตรวจสอบจาวาสคริปต์สามารถถูกแฮ็กได้อย่างง่ายดาย
Randell

ควรจะหา regex ที่น่าเชื่อถือกว่าสำหรับการจับคู่ URL (ในจาวาสคริปต์) ได้ค่อนข้างง่าย โปรดทราบว่าฉันไม่แนะนำให้ใช้ตัวแปรเป็นตัวพิมพ์ใหญ่ (เช่นRegExpในตัวอย่างของคุณ) เว้นแต่ว่าจะเป็นตัวสร้าง / เนมสเปซ (ซึ่งตัวแปรของคุณไม่ใช่) อย่าลืมว่าRegExp#testส่งคืนบูลีนอยู่แล้วดังนั้นคุณไม่จำเป็นต้องใช้ if / else; แค่ทำ - return re.test(url).
kangax

5
หมายเหตุ: url "wwww"; เป็น URL ที่ถูกต้อง คุณสามารถมีโฮสต์ชื่อ wwww
kanngard

ปลั๊กอิน Jquery ตรวจสอบความถูกต้องของ URL ด้วย docs.jquery.com/Plugins/Validation/Methods/url
Codler

2
ห้องสมุดปิดของ Google มีเครื่องมือตรวจสอบ URL ในgoog.string.linkifynamespace ที่คุณสามารถตัดออกจากแหล่งที่มาที่นี่: code.google.com/p/closure-library/source/browse/closure/goog/...findFirstUrl()ดูที่
Technetium

คำตอบ:


69

มีคนพูดถึงปลั๊กอินการตรวจสอบความถูกต้อง Jquery ดูเหมือนว่าจะมากเกินไปหากคุณต้องการตรวจสอบความถูกต้องของ URL นี่คือบรรทัดของ regex จากปลั๊กอิน:

return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);

นี่คือที่ที่พวกเขาได้รับจาก: http://projects.scottsplayground.com/iri/

ชี้โดย @nhahtdh สิ่งนี้ได้รับการอัปเดตเป็น:

        // Copyright (c) 2010-2013 Diego Perini, MIT licensed
        // https://gist.github.com/dperini/729294
        // see also https://mathiasbynens.be/demo/url-regex
        // modified to allow protocol-relative URLs
        return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|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.test( value );

แหล่งที่มา: https://github.com/jzaefferer/jquery-validation/blob/c1db10a34c0847c28a5bd30e3ee1117e137ca834/src/core.js#L1349


วิธีการตรวจสอบความถูกต้องของ jQuery อนุญาตให้มีเครื่องหมายขีดล่าง ("_") ในชื่อโดเมน เท่าที่ฉันพบไม่อนุญาตให้ใช้ในชื่อโดเมน อนุญาตเฉพาะขีดกลาง ("-") filter_var($url, FILTER_VALIDATE_URL)ดูเหมือนว่าPHP จะไม่อนุญาตให้มีเครื่องหมายขีดล่างในชื่อโดเมนเช่น
Vladius

ช่วง \ u00A0- \ uD7FF กว้างเกินไป อักขระเครื่องหมายคำพูดเช่น” (\ u201D) อยู่ในช่วงดังกล่าว ตัวอย่างเช่นหากแบ่งช่องว่างเป็นครั้งแรกส่วนท้ายของประโยคที่ยกมาอาจเป็น "this" "หากในทางเทคนิคแล้วไม่ได้เป็นผลบวกลวงโดยทั่วไปจะเป็นไปในทางปฏิบัติหากใช้ regex นี้เพื่อระบุ url
MetaThis

2
regex ด้านบนถูกแทนที่ด้วย regex ของ Diego Perini ในแหล่งที่มาของการตรวจสอบ jQuery: github.com/jzaefferer/jquery-validation/blob/master/src/…
nhahtdh

1
regex ได้ย้ายไปที่บรรทัด 1306 แล้ว - github.com/jzaefferer/jquery-validation/blob/master/src/…
The Only One Around

2
@Kousha: www.google.com ไม่ใช่ URL ที่ถูกต้องดังนั้นจึงควรล้มเหลวในการทดสอบ
Mr. Lance E Sloan

47

การแยกวิเคราะห์ URL โดยใช้ regex ไม่เป็นประโยชน์ การนำกฎ RFC1738 ไปใช้อย่างสมบูรณ์จะส่งผลให้ regex ยาวมาก (สมมติว่าเป็นไปได้) แน่นอนว่านิพจน์ปัจจุบันของคุณล้มเหลวหลาย URL ที่ถูกต้องและส่งผ่าน URL ที่ไม่ถูกต้อง

แทน:

ก. ใช้ตัวแยกวิเคราะห์ URL ที่เหมาะสมซึ่งเป็นไปตามกฎจริง (ฉันไม่รู้จัก JavaScript มันอาจจะมากเกินไปคุณสามารถทำได้ที่ฝั่งเซิร์ฟเวอร์) หรือ,

ข. เพียงแค่ตัดช่องว่างนำหน้าหรือต่อท้ายออกจากนั้นตรวจสอบว่ามีรูปแบบที่คุณต้องการอยู่ด้านหน้า (โดยทั่วไปคือ "http: //" หรือ "https: //") และปล่อยไว้ที่ หรือ,

ค. พยายามใช้ URL และดูสิ่งที่อยู่ในตอนท้ายตัวอย่างเช่นโดยการส่งคำขอ HTTP HEAD จากฝั่งเซิร์ฟเวอร์ หากคุณได้รับข้อผิดพลาด 404 หรือการเชื่อมต่ออาจผิดพลาด

มันคืนค่าจริงแม้ว่า url จะเป็น " http: // wwww " ก็ตาม

นั่นเป็น URL ที่ถูกต้องอย่างสมบูรณ์

หากคุณต้องการตรวจสอบว่าชื่อโฮสต์เช่น 'wwww' มีอยู่จริงหรือไม่คุณไม่มีทางเลือกอื่นนอกจากค้นหาใน DNS อีกครั้งนี่จะเป็นรหัสฝั่งเซิร์ฟเวอร์


44
นี่เป็นแนวทางปฏิบัติหรือไม่? ใช่. ตอบคำถามหรือให้ข้อมูลเพียงพอสำหรับการนำไปปฏิบัติจริงหรือไม่? เลขที่
coreyward

1
เพื่อให้นิพจน์ทั่วไปตรงกับ IRI ( RFC 3987 ) อย่างใกล้ชิดโปรดดู " นิพจน์ทั่วไปสำหรับ URL ที่สอดคล้องกับ W3C? " โปรดทราบว่าสิ่งนี้จะตรงกับIRIไม่ใช่แค่ URL ( RFC 1738 ) หรือ URI ( RFC 3986 )
Robin Winslow

33
function validateURL(textval) {
    var urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
    return urlregex.test(textval);
}

สิ่งนี้สามารถคืนค่าจริงสำหรับ URL เช่น:

http://stackoverflow.com/questions/1303872/url-validation-using-javascript

หรือ:

http://regexlib.com/DisplayPatterns.aspx?cattabindex=1&categoryId=2

2
ทำไมต้องRegExpสร้าง? ตัวอักษรใช้ได้ที่นี่ เหตุใดจึงกำหนดวัตถุให้กับตัวแปร function validateURL(textval) { return /^(http...$/.test(textval) }สั้นกว่าเล็กน้อยและชัดเจนกว่า
davidchambers

7
[... & amp; ... ] จะไม่ทำในสิ่งที่คุณคาดหวัง คลาสอักขระไม่อนุญาตให้ใช้สตริง
genio

URL นี้ไม่ผ่านการตรวจสอบความถูกต้องแม้ว่าจะถูกต้องตามกฎหมาย: uk.reuters.com/article/2013/02/25/… (ลบ 20130225 จากท้ายและถูกต้อง)
ytoledano

asdf.asdf กำลังส่งคืน true พร้อมกับอันนี้ ทำไม?
Raza Ahmed

ทุกอย่างขึ้นอยู่กับสิ่งที่คุณเข้าใจโดย "URL ที่ถูกต้อง" ตัวอย่างทั้งหมดที่คุณได้รับจะทำงาน (ถือว่าถูกต้อง) เมื่อวางไปยังแถบที่อยู่ของเบราว์เซอร์และส่วนใหญ่มีแนวโน้มที่จะล้มเหลว (ที่ไม่ถูกต้องถือว่า) <a href="">เมื่อใช้เป็นค่าของ
trejder

16

ฉันเขียนฐานฟังก์ชันการตรวจสอบ URL บน rfc1738 และ rfc3986 เพื่อตรวจสอบ http และ https urls ฉันพยายามถือโมดูลาร์นี้เพื่อให้สามารถบำรุงรักษาและปรับให้เข้ากับความต้องการของตัวเองได้ดีขึ้น

RegExp ในบรรทัดเดียวจะแสดงที่ท้ายโพสต์นี้

RegExp ยอมรับ HTTP และ HTTPS URL ที่มีโดเมนสากลหรือหมายเลข IPv4 ยังไม่รองรับ IPv6

window.isValidURL = (function() {// wrapped in self calling function to prevent global pollution

     //URL pattern based on rfc1738 and rfc3986
    var rg_pctEncoded = "%[0-9a-fA-F]{2}";
    var rg_protocol = "(http|https):\\/\\/";

    var rg_userinfo = "([a-zA-Z0-9$\\-_.+!*'(),;:&=]|" + rg_pctEncoded + ")+" + "@";

    var rg_decOctet = "(25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|[1-9][0-9]|[0-9])"; // 0-255
    var rg_ipv4address = "(" + rg_decOctet + "(\\." + rg_decOctet + "){3}" + ")";
    var rg_hostname = "([a-zA-Z0-9\\-\\u00C0-\\u017F]+\\.)+([a-zA-Z]{2,})";
    var rg_port = "[0-9]+";

    var rg_hostport = "(" + rg_ipv4address + "|localhost|" + rg_hostname + ")(:" + rg_port + ")?";

    // chars sets
    // safe           = "$" | "-" | "_" | "." | "+"
    // extra          = "!" | "*" | "'" | "(" | ")" | ","
    // hsegment       = *[ alpha | digit | safe | extra | ";" | ":" | "@" | "&" | "=" | escape ]
    var rg_pchar = "a-zA-Z0-9$\\-_.+!*'(),;:@&=";
    var rg_segment = "([" + rg_pchar + "]|" + rg_pctEncoded + ")*";

    var rg_path = rg_segment + "(\\/" + rg_segment + ")*";
    var rg_query = "\\?" + "([" + rg_pchar + "/?]|" + rg_pctEncoded + ")*";
    var rg_fragment = "\\#" + "([" + rg_pchar + "/?]|" + rg_pctEncoded + ")*";

    var rgHttpUrl = new RegExp( 
        "^"
        + rg_protocol
        + "(" + rg_userinfo + ")?"
        + rg_hostport
        + "(\\/"
        + "(" + rg_path + ")?"
        + "(" + rg_query + ")?"
        + "(" + rg_fragment + ")?"
        + ")?"
        + "$"
    );

    // export public function
    return function (url) {
        if (rgHttpUrl.test(url)) {
            return true;
        } else {
            return false;
        }
    };
})();

RegExp ในหนึ่งบรรทัด:

var rg = /^(http|https):\/\/(([a-zA-Z0-9$\-_.+!*'(),;:&=]|%[0-9a-fA-F]{2})+@)?(((25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|[1-9][0-9]|[0-9])(\.(25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|[1-9][0-9]|[0-9])){3})|localhost|([a-zA-Z0-9\-\u00C0-\u017F]+\.)+([a-zA-Z]{2,}))(:[0-9]+)?(\/(([a-zA-Z0-9$\-_.+!*'(),;:@&=]|%[0-9a-fA-F]{2})*(\/([a-zA-Z0-9$\-_.+!*'(),;:@&=]|%[0-9a-fA-F]{2})*)*)?(\?([a-zA-Z0-9$\-_.+!*'(),;:@&=\/?]|%[0-9a-fA-F]{2})*)?(\#([a-zA-Z0-9$\-_.+!*'(),;:@&=\/?]|%[0-9a-fA-F]{2})*)?)?$/;

2
นี่มันเยี่ยมมาก! มีประโยชน์มากที่คุณแยกมันออกเป็นส่วนต่างๆ - ฉันไม่ต้องการเพียงแค่เชื่อว่า regex ขนาดใหญ่สุ่มสี่สุ่มห้า
Jason

12

ในสถานการณ์ที่คล้ายกันฉันหลีกเลี่ยงสิ่งนี้:

someUtils.validateURL = function(url) {
    var parser = document.createElement('a');
    try {
        parser.href = url;
        return !!parser.hostname;
    } catch (e) {
        return false;
    }
};

เช่นทำไมต้องประดิษฐ์วงล้อถ้าเบราว์เซอร์สามารถทำเพื่อคุณ? แต่แน่นอนว่าจะใช้ได้เฉพาะในเบราว์เซอร์เท่านั้น

มีหลายส่วนของ URL ที่แยกวิเคราะห์ว่าเบราว์เซอร์จะตีความอย่างไร:

parser.protocol; // => "http:"
parser.hostname; // => "example.com"
parser.port;     // => "8080"
parser.pathname; // => "/path/"
parser.search;   // => "?search=test"
parser.hash;     // => "#hash"
parser.host;     // => "example.com:3000"

การใช้สิ่งเหล่านี้คุณสามารถปรับปรุงฟังก์ชันการตรวจสอบความถูกต้องของคุณได้ขึ้นอยู่กับข้อกำหนด ข้อเสียเปรียบเพียงประการเดียวคือจะยอมรับ URL สัมพัทธ์และใช้โฮสต์และพอร์ตของเซิร์ฟเวอร์เพจปัจจุบัน แต่คุณสามารถใช้เพื่อประโยชน์ของคุณได้โดยการประกอบ URL ใหม่จากส่วนต่างๆและส่งต่อไปยังบริการ AJAX ของคุณอย่างสมบูรณ์

สิ่งที่validateURLไม่ยอมรับคือ URL ที่ไม่ถูกต้องเช่นhttp:\:8883จะส่งคืนเท็จ แต่:1234ถูกต้องและถูกตีความว่าhttp://pagehost.example.com/:1234 ie เป็นพา ธ สัมพัทธ์

อัปเดต

วิธีนี้ใช้ไม่ได้กับ Chrome และเบราว์เซอร์ WebKit อื่น ๆ อีกต่อไป แม้ว่า URL จะไม่ถูกต้อง แต่ชื่อโฮสต์ก็เต็มไปด้วยค่าบางอย่างเช่นนำมาจากbaseที่ไม่ถูกต้องชื่อโฮสต์ที่เต็มไปด้วยค่าบางอย่างเช่นนำมาจาก ยังคงช่วยในการแยกวิเคราะห์บางส่วนของ URL แต่จะไม่อนุญาตให้ตรวจสอบความถูกต้อง

แนวทางที่ไม่มีตัวแยกวิเคราะห์ที่ดีกว่าที่เป็นไปได้คือการใช้var parsedURL = new URL(url)และจับข้อยกเว้น ดูเช่นURL API รองรับโดยเบราว์เซอร์หลักและ NodeJS ทั้งหมดแม้ว่าจะยังคงถูกทำเครื่องหมายอยู่ในช่วงทดลอง


3
สิ่งนี้จะส่งคืน TRUE สำหรับ<script>alert();</script>
Subin

2
@Subin ในเบราว์เซอร์สมัยใหม่แนวทางในคำตอบนี้ใช้ไม่ได้อีกต่อไป ขอบคุณที่ให้ความสนใจ ในความเป็นจริงชื่อโฮสต์จะเต็มไปไม่ว่าคุณจะผ่านสตริงใดก็ตาม
Alex Pakka

8

regex ที่ดีที่สุดที่ฉันพบจากhttp://angularjs.org/

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


ถ้าฉันทดสอบสิ่งนี้: ---- / ^ (ftp | http | https): \ / \ / (\ w +: {0,1} \ w * @)? (\ S +) (: [0-9] + )? (\ / | \ / ([\ w #!:.? + = &% @! \ - \ /]))? $ /. test (' abc.com.com.com' ) จะคืนค่าที่แท้จริง . ฉันคิดว่าควรอนุญาตให้ใช้ได้เพียง 2. com ใน url
Abhishek

5

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

function validateURL(value) {
    return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
    }

จากตรงนั้นเป็นเพียงเรื่องของการเรียกใช้ฟังก์ชันเพื่อรับกลับจริงหรือเท็จ:

validateURL(urltovalidate);

โปรดทราบว่าสิ่งนี้จะล้มเหลวสำหรับที่อยู่ IP
Aakil Fernandes

5

ฉันรู้ว่ามันค่อนข้างเป็นคำถามเก่า แต่เนื่องจากไม่มีคำตอบใด ๆ ที่เป็นที่ยอมรับฉันขอแนะนำให้คุณใช้กรอบงาน URI.js: https://github.com/medialize/URI.js

คุณสามารถใช้เพื่อตรวจสอบ URI ที่ผิดรูปแบบโดยใช้บล็อก try / catch:

function isValidURL(url)
{
    try {
        (new URI(url));
        return true;
    }
    catch (e) {
        // Malformed URI
        return false;
    }
}

แน่นอนว่ามันจะพิจารณาบางอย่างเช่น "% @" เป็น URI สัมพัทธ์ที่มีรูปแบบดี ... ดังนั้นฉันขอแนะนำให้คุณอ่าน URI.js APIเพื่อทำการตรวจสอบเพิ่มเติมเช่นหากคุณต้องการให้แน่ใจว่าผู้ใช้ป้อนรูปแบบที่ดี URL ที่สมบูรณ์คุณสามารถทำได้ดังนี้:

function isValidURL(url)
{
    try {
        var uri = new URI(url);
        // URI has a scheme and a host
        return (!!uri.scheme() && !!uri.host());
    }
    catch (e) {
        // Malformed URI
        return false;
    }
}

มันล้มเหลวใน HTT: // localhost: 86 / asdfghjkl
Shivam Chawla

URL ของคุณถูกต้องดังนั้นการทดสอบจึงคืนค่าจริง ฉันเดาว่าสิ่งที่คุณต้องการทำคือตรวจสอบว่าโปรโตคอลเป็น http (s) จากนั้นเพิ่ม a !!uri.scheme().match(/^http(s?)$/)ในการทดสอบ
Romain


2

คุณสามารถใช้URL APIที่เพิ่งเป็นมาตรฐานได้ การสนับสนุนเบราว์เซอร์นั้นดีที่สุดโปรดดูที่ลิงค์ new URL(str)รับประกันการโยนTypeError URL ที่ไม่ถูกต้อง

ตามที่ระบุไว้ข้างต้นhttp://wwwwเป็น URL ที่ถูกต้อง


1

หากคุณกำลังมองหา regex ที่น่าเชื่อถือกว่านี้ให้ดูที่ RegexLib นี่คือหน้าที่คุณอาจสนใจ:

http://regexlib.com/Search.aspx?k=url

ในฐานะที่เป็นข้อผิดพลาดที่แสดงให้เห็นในขณะที่คนที่ยังคงมีการพิมพ์เปลี่ยนจากเหตุการณ์keydownไปblurแล้วก็จะตรวจสอบเฉพาะครั้งเดียวย้ายคนที่จะองค์ประกอบถัดไป




0

การสาธิต: http://jsbin.com/uzimeb/1/edit

function checkURL(value) {
    var urlregex = new RegExp("^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&amp;%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&amp;%\$#\=~_\-]+))*$");
    if (urlregex.test(value)) {
        return (true);
    }
    return (false);
}

0

ฉันพบแหล่งข้อมูลที่ยอดเยี่ยมสำหรับการเปรียบเทียบโซลูชันต่างๆ: https://mathiasbynens.be/demo/url-regex

ตามหน้านั้นมีเพียงโซลูชันจาก diegoperini เท่านั้นที่ผ่านการทดสอบทั้งหมด นี่คือ regex:

_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!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\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$_iuS

0

ฉันตรวจสอบตัวตรวจสอบ URL จำนวนมากใน Google และไม่มีใครทำงานให้ฉัน ตัวอย่างเช่นฉันต้องการเห็นว่าถูกต้องในลิงก์เช่น "aa.com" ฉันชอบตรวจสอบโง่ ๆ สำหรับสตริงการลงชื่อเข้าใช้จุด

function isValidUri(str) {
  var dotIndex = str.indexOf('.');
  return (dotIndex > 0 && dotIndex < str.length - 2);
}

ไม่ควรอยู่ที่จุดเริ่มต้นและจุดสิ้นสุดของสตริง (ตอนนี้เราไม่มีชื่อโดเมนระดับบนสุดที่มีอักขระเดียว)


-1

นี่คือนิพจน์ทั่วไปที่อาจเข้ากับใบเรียกเก็บเงิน (มันยาวมาก):

/^(?:\u0066\u0069\u006C\u0065\u003A\u002F{2}(?:\u002F{2}(?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*\u0040)?(?:\u005B(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){6}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){5}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){4}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A)?[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){3}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,2}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,3}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,4}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,5}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,6}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2})\u005D|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])|(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039](?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D]+)?[\u0041-\u005A\u0061-\u007A\u0030-\u0039])?|(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039](?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D]+)?[\u0041-\u005A\u0061-\u007A\u0030-\u0039])?\u002E)+[\u0041-\u005A\u0061-\u007A\u0030-\u0039](?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D]+)?[\u0041-\u005A\u0061-\u007A\u0030-\u0039])?))(?:\u003A(?:\u0030-\u0035\u0030-\u0039{0,4}|\u0036\u0030-\u0034\u0030-\u0039{3}|\u0036\u0035\u0030-\u0034\u0030-\u0039{2}|\u0036\u0035\u0035\u0030-\u0032\u0030-\u0039|\u0036\u0035\u0035\u0033\u0030-\u0035))?(?:\u002F(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*)*|\u002F(?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])+(?:\u002F(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*)*)?|(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])+(?:\u002F(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*)*)|[\u0041-\u005A\u0061-\u007A][\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002B\u002D\u002E]*\u003A(?:\u002F{2}(?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*\u0040)?(?:\u005B(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){6}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){5}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){4}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A)?[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){3}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,2}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,3}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,4}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035]))|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,5}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}|(?:(?:[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4}\u003A){0,6}[\u0030-\u0039\u0041-\u0046\u0061-\u0066]{1,4})?\u003A{2})\u005D|(?:(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])\u002E){3}(?:[\u0030-\u0039]|[\u0031-\u0039][\u0030-\u0039]|\u0031[\u0030-\u0039]{2}|\u0032[\u0030-\u0034][\u0030-\u0039]|\u0032\u0035[\u0030-\u0035])|(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039](?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D]+)?[\u0041-\u005A\u0061-\u007A\u0030-\u0039])?|(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039](?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D]+)?[\u0041-\u005A\u0061-\u007A\u0030-\u0039])?\u002E)+[\u0041-\u005A\u0061-\u007A\u0030-\u0039](?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D]+)?[\u0041-\u005A\u0061-\u007A\u0030-\u0039])?))(?:\u003A(?:\u0030-\u0035\u0030-\u0039{0,4}|\u0036\u0030-\u0034\u0030-\u0039{3}|\u0036\u0035\u0030-\u0034\u0030-\u0039{2}|\u0036\u0035\u0035\u0030-\u0032\u0030-\u0039|\u0036\u0035\u0035\u0033\u0030-\u0035))?(?:\u002F(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*)*|\u002F(?:(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])+(?:\u002F(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*)*)?|(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])+(?:\u002F(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*)*)(?:\u003F(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040\u002F\u003F]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*)?(?:\u0023(?:[\u0041-\u005A\u0061-\u007A\u0030-\u0039\u002D\u002E\u005F\u007E\u0021\u0024\u0026\u0027\u0028\u0029\u002A\u002B\u002C\u003B\u003D\u003A\u0040\u002F\u003F]|\u0025[\u0030-\u0039\u0041-\u0046\u0061-\u0066][\u0030-\u0039\u0041-\u0046\u0061-\u0066])*)?)$/

มีข้อแม้บางประการสำหรับการใช้งานกล่าวคือไม่ได้ตรวจสอบความถูกต้อง URI ซึ่งมีข้อมูลเพิ่มเติมหลังชื่อผู้ใช้ (เช่น "ชื่อผู้ใช้: รหัสผ่าน") นอกจากนี้เฉพาะที่อยู่ IPv6 เท่านั้นที่สามารถอยู่ในไวยากรณ์ IP ลิเทอรัลและในขณะนี้ไวยากรณ์ "IPvFuture" จะถูกละเว้นและจะไม่ตรวจสอบความถูกต้องกับนิพจน์ทั่วไปนี้ หมายเลขพอร์ตยังถูก จำกัด ให้อยู่ระหว่าง 0 ถึง 65,535 นอกจากนี้เฉพาะรูปแบบไฟล์เท่านั้นที่สามารถใช้เครื่องหมายทับสามตัว (เช่น "file: /// etc / sysconfig") และสามารถละเว้นทั้งส่วนสืบค้นและส่วนย่อยของ URI ในที่สุดก็มุ่งไปที่ URI ปกติไม่ใช่ IRI ดังนั้นจึงมุ่งเน้นไปที่ชุดอักขระ ASCII

นิพจน์ทั่วไปนี้สามารถขยายได้ แต่มีความซับซ้อนและยาวพอที่เป็นอยู่แล้ว ฉันยังไม่สามารถรับประกันได้ว่าจะ "ถูกต้อง 100%" หรือ "ปราศจากข้อบกพร่อง" แต่ควรตรวจสอบ URI อย่างถูกต้องสำหรับทุกรูปแบบ

คุณจะต้องทำการตรวจสอบเพิ่มเติมสำหรับข้อกำหนดเฉพาะโครงการใด ๆ หรือทำการปรับมาตรฐาน URI เนื่องจากนิพจน์ทั่วไปนี้จะตรวจสอบ URI ที่หลากหลายมาก


-2

ลองแก้ไขisValidURLฟังก์ชันของคุณดังนี้:

function isValidURL(url) {
    var encodedURL = encodeURIComponent(url);
    var isValid = false;

    $.ajax({
      url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" + encodedURL + "%22&format=json",
      type: "get",
      async: false,
      dataType: "json",
      success: function(data) {
        isValid = data.query.results != null;
      },
      error: function(){
        isValid = false;
      }
    });

    return isValid;
}

นี้ควรทำเคล็ดลับ


เนื่องจาก ajax เป็น async isValid จะส่งคืนเท็จเสมอใช่ไหม
chepe263

ไม่ Ajax เป็นแบบ async แต่ลองดูที่การโทร มันระบุ "async: false"
Ohad

หลีกเลี่ยงการโทรแบบซิงโครนัสได้ดีที่สุดเนื่องจากผลกระทบด้านประสิทธิภาพ ปัญหาเช่นกันคือฟังก์ชันที่นี่จะแสดงผลลัพธ์ที่ไม่ถูกต้องหากเครือข่ายของคุณไม่ทำงาน นอกจากนี้มันจะรั่ว URL ทั้งหมดของคุณไปยัง yahoo
Philipp Claßen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.