2013-03-26 32 views

Trả lời

1

Như bạn đã chấp nhận một câu trả lời. Để hiển thị một số mở rộng hơn phù hợp và kiểm soát trận đấu, điều này có thể giúp bạn trong tương lai:

var url = 'http://link.com//whatever///'; 
var set = url.match(/([^:]\/{2,3})/g); // Match (NOT ":") followed by (2 OR 3 "/") 

for (var str in set) { 
    // Modify the data you have 
    var replace_with = set[str].substr(0, 1) + '/'; 

    // Replace the match 
    url = url.replace(set[str], replace_with); 
} 

console.log(url); 

Will đầu ra:

http://link.com/whatever/ 

Doublets sẽ không thành vấn đề trong tình huống của bạn. Nếu bạn có chuỗi này:

var url = 'http://link.com//om/om/om/om/om///'; 

Mảng set của bạn sẽ chứa nhiều m//. Một chút dư thừa, vì vòng lặp sẽ thấy biến đó một vài lần. Điều tốt đẹp là String.replace() thay thế không có gì nếu nó không tìm thấy gì, vì vậy không có hại gì được thực hiện.

Những gì bạn có thể làm là loại bỏ các bản sao từ set trước, nhưng điều đó hầu như sẽ yêu cầu cùng một lượng tài nguyên như chỉ cho phép vòng lặp đi qua chúng.

Chúc may mắn!

28

Tôi nghĩ rằng điều này sẽ làm việc: /[^:](\/+)/ hoặc /[^:](\/\/+)/ nếu bạn muốn chỉ bội.

Nó không khớp với số // hàng đầu nhưng có vẻ như bạn không tìm kiếm điều đó.

Để thay thế:

"http://test//a/b//d".replace(/([^:]\/)\/+/g, "$1") // --> http://test/a/b/d 

Working Demo

+0

Khi tôi cố gắng thay thế các kết quả khớp bằng một dấu gạch chéo về phía trước, trước tiên anh ta trả về http: /link.co/whateve/ và thứ hai ttp: //link.co/whateve/. Đối với một số lý do nó loại bỏ ký tự đầu tiên trước đó. – geochr

+0

Ồ, bạn muốn _replace_ chúng, và không chỉ _match_ chúng? Đó là một sự khác biệt quan trọng. – Halcyon

+0

@JeffShaver no: nó loại bỏ một số ký tự –

-1
result = subject.replace(/(?<!http:)\/*\//g, "/"); 

hoặc (cho http, https, ftp và FTPS)

result = subject.replace(/(?<!(?:ht|f)tps?:)\/*\//g, "/"); 
+0

Câu hỏi ban đầu không hỏi bất cứ điều gì về việc thay thế chương trình. Câu trả lời này không liên quan. – codeadventurer

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