2012-01-10 31 views
9

Tôi có trình xác thực URL đơn giản. Trình xác thực url hoạt động giống như mọi trình xác thực khác.URI Regex: Thay thế http: //, https: //, ftp: // bằng chuỗi trống nếu URL hợp lệ

Bây giờ tôi muốn, nếu URL được chuyển, hãy lấy https: //, http: // và xóa URL đó cho var b. Vì vậy, những gì tôi đã làm là tôi đã thực hiện một Regex khác chụp https: //, http: //, ftp: // etc và nói nếu url đã vượt qua bài kiểm tra dài, hãy làm bài kiểm tra thứ hai và thay thế nó với chuỗi rỗng.

Dưới đây là những gì tôi đã đưa ra:

$("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') 
    } 

}); 

Tại sao điều này không hoạt động?

+0

hãy xác định "không hoạt động" – Alnitak

+0

vì protomatch.test (url) trả về đúng hoặc sai, không phải là chuỗi – Hoff

+2

Regex bạn đang sử dụng ở đó vượt quá giới hạn của sự tỉnh táo. Bạn phải phá vỡ nó, nếu không nó là một đống không thể quản lý, unintelligible, unmaintainable của nhân vật và trong trạng thái này nó sẽ không làm bạn bất kỳ tốt. Thử cách tiếp cận theo giai đoạn: Giai đoạn một: Kiểm tra cấu trúc cơ bản, thu hút các cấu trúc cơ bản đó thành các nhóm. Giai đoạn 2: Các bài kiểm tra cơ bản hơn về các nhóm để xác định nội dung của chúng: Giai đoạn 3: Các bài kiểm tra tính hợp lệ cá nhân và trích xuất giá trị từ các nhóm đó. Có, nó là một ít mã hơn, nhưng nó sẽ không làm cho đầu của bạn bị tổn thương và nó sẽ có ít lỗi hơn. – Tomalak

Trả lời

11

protomatch.test() trả về boolean chứ không phải chuỗi.

Tôi nghĩ rằng bạn chỉ muốn:

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

FWIW, match regexp của bạn là hoàn toàn bất khả xâm phạm, và gần như chắc chắn sai. Nó có lẽ không cho phép các tên miền quốc tế, nhưng thật khó để đọc mà tôi không thể chắc chắn.

+0

Tuyệt. Tôi nên kiểm tra protomotach.test() trên bàn điều khiển. Cảm ơn bạn. – jQuerybeast

+0

Nó hoạt động. nó đã tiết kiệm thời gian của tôi. Cảm ơn. @alnitak – Kabkee

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

điều này sẽ xóa định danh lược đồ URL _any_, không chỉ 'https',' http' và 'ftp'. – Alnitak

+3

Tôi biết, nhưng không phải tác giả muốn giống nhau không? "https: //, http: //, ftp: // etc" – YuS

+1

điều gì xảy ra nếu bản thân url không chứa http hoặc https ở một số trường hợp. – sms

0

Nếu bạn muốn có một cách tiếp cận chung chung hơn, như Yuri, nhưng mà sẽ làm việc đối với trường hợp hơn:

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

Có thể có một giao thức trống rỗng, như: //example.com, vì vậy dựa vào ': //' có thể không bao gồm tất cả các trường hợp.

Các vấn đề liên quan