2012-01-10 17 views
9

मेरे पास एक सरल यूआरएल सत्यापनकर्ता है, तो खाली स्ट्रिंग के साथ http: //, https: //, ftp: // बदलें। यूआरएल सत्यापनकर्ता शायद हर दूसरे वैधकर्ता के रूप में काम करता है।यूआरआई रेगेक्स: यूआरएल मान्य

अब मैं चाहता हूं कि यूआरएल पास हो गया है, तो https: //, http: // लें और var b के लिए इसे हटा दें।

तो मैंने जो किया है, मैंने एक और रेगेक्स बनाया है जो https: //, http: //, ftp: // आदि को कैप्चर करता है और कहता है कि यूआरएल ने लंबे परीक्षण को पारित किया है, दूसरा परीक्षण प्राप्त करें और इसे प्रतिस्थापित करें खाली स्ट्रिंग के साथ।

$("button").on('click', function() { 
    var url = $('#in').val(); 

    var match = /^([a-z][a-z0-9\*\-\.]*):\/\/(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)*(?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})[email protected])?(?:(?:[a-z0-9\-\.]|%[0-9a-f]{2})+|(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\]))(?::[0-9]+)?(?:[\/|\?](?:[\w#!:\.\?\+=&@!$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)?$/; 
    var protomatch = /^(https?|ftp):\/\/(.*)/; 


    if (match.test(url)) { // IF VALID 
     console.log(url + ' is valid'); 

     // if valid replace http, https, ftp etc with empty 
     var b = url.replace(protomatch.test(url), ''); 
     console.log(b) 

    } else { // IF INVALID 
     console.log('not valid') 
    } 

}); 

क्यों यह काम नहीं करता:

यहाँ मैं के साथ आया है?

+0

कृपया परिभाषित करें "0 काम नहीं करता" – Alnitak

+0

क्योंकि protomatch.test (url) सत्य या गलत लौटाता है, स्ट्रिंग नहीं – Hoff

+2

आप जिस रेगेक्स का उपयोग कर रहे हैं वह सैनिटी की सीमा से परे है। आपको इसे तोड़ना होगा, अन्यथा यह पात्रों का एक अप्रबंधनीय, अस्पष्ट, अनजान ढेर है और इस स्थिति में यह आपको कोई अच्छा काम नहीं करेगा। एक चरणबद्ध दृष्टिकोण आज़माएं: चरण एक: बुनियादी संरचनात्मक परीक्षण, समूहों में उन बुनियादी संरचनाओं को पकड़ना। चरण 2: समूहों पर उनकी सामग्री निर्धारित करने के लिए अधिक बुनियादी परीक्षण: चरण 3: उन लोगों से व्यक्तिगत वैधता परीक्षण और मूल्य निष्कर्षण। हां, यह थोड़ा और कोड है, लेकिन यह आपके सिर को चोट नहीं पहुंचाएगा और इसमें कम कीड़े होंगे। – Tomalak

उत्तर

11

protomatch.test() एक बूलियन लौटाता है, स्ट्रिंग नहीं।

मुझे लगता है कि तुम सिर्फ हैं:

var protomatch = /^(https?|ftp):\/\//; // NB: not '.*' 
... 
var b = url.replace(protomatch, ''); 

Fwiw, अपने match regexp पूरी तरह से अभेद्य है, और लगभग निश्चित रूप से गलत है। यह शायद अंतरराष्ट्रीय डोमेन को अनुमति नहीं देता है, लेकिन यह पढ़ना इतना मुश्किल है कि मैं निश्चित रूप से नहीं बता सकता।

+0

ग्रेट। मुझे कंसोल पर protomotach.test() का परीक्षण करना चाहिए। धन्यवाद। – jQuerybeast

+0

यह काम करता है। यह मेरा समय बचाया। धन्यवाद। @alnitak – Kabkee

23
var b = url.substr(url.indexOf('://')+3); 
+2

यह _any_ URL योजना पहचानकर्ता को हटा देगा, न केवल 'https',' http' और 'ftp'। – Alnitak

+3

मुझे पता है, लेकिन लेखक को वही नहीं चाहिए था? "https: //, http: //, ftp: // आदि" – YuS

+1

क्या होता है यदि यूआरएल में कुछ मामलों में http या https शामिल नहीं है। – sms

0

आप एक अधिक सामान्य दृष्टिकोण चाहते हैं, यूरी की तरह है, लेकिन जो अधिक मामलों के लिए काम करेंगे, तो:

var b = url.replace(/^.*:\/\//i, ''); 
0

वहाँ एक खाली प्रोटोकॉल, जैसे हो सकता है: //example.com, इसलिए भरोसा '// //' पर सभी मामलों को शामिल नहीं किया जा सकता है।

संबंधित मुद्दे