2012-06-26 20 views
6

Tôi biết điều này đã được hỏi hàng nghìn lần trước (xin lỗi), nhưng tìm kiếm SO/Google v.v. Tôi chưa nhận được câu trả lời kết luận. Về cơ bản, tôi cần một hàm JS khi được truyền một chuỗi, xác định & trích xuất tất cả các URL dựa trên regex, trả về một mảng tất cả các tìm thấy. ví dụ:Javascript: trích xuất URL từ chuỗi (inc. Querystring) và trả về mảng

function findUrls(searchText){ 
    var regex=??? 
    result= searchText.match(regex); 
    if(result){return result;}else{return false;} 
} 

Chức năng sẽ có thể phát hiện và trả về bất kỳ url tiềm năng nào. Tôi nhận thức được những khó khăn kế thừa/isses với điều này (đóng ngoặc đơn vv), vì vậy tôi có một cảm giác quá trình cần phải:

Chia chuỗi (searchText) thành các phần riêng biệt bắt đầu/kết thúc) không gian hoặc vận chuyển trở về hai bên của nó, dẫn đến khối nội dung riêng biệt, ví dụ làm một phần.

Đối với mỗi nội dung kết quả từ phần tách, xem liệu nó có phù hợp với logic cho URL của bất kỳ công trình nào hay không, cụ thể là nó có dấu chấm ngay sau văn bản (quy tắc một hằng để đủ điều kiện cho URL tiềm năng).

Regex nên xem liệu dấu chấm đó có được theo sau bởi văn bản khác hay không, thuộc loại được phép cho cấu trúc thư mục tld, & và trước văn bản loại cho phép đối với URL.

Tôi biết rằng các kết quả dương tính giả có thể xảy ra, tuy nhiên, bất kỳ giá trị trả lại nào sẽ được kiểm tra bằng một cuộc gọi đến chính URL đó, vì vậy, điều này có thể bị bỏ qua. Các chức năng khác tôi đã tìm thấy thường không trả lại chuỗi truy vấn URL quá, nếu có.

Từ một khối văn bản, do đó chức năng có thể trả về bất kỳ loại URL nào, ngay cả khi nó có nghĩa là xác định will.i.am là một giá trị hợp lệ!

ví dụ: http://www.google.com, google.com, www.google.com, http://google.com, ftp.google.com, https: // vv ... và bất kỳ nguồn gốc của chúng có một chuỗi truy vấn nên được trả lại ...

Rất cám ơn, xin lỗi một lần nữa nếu điều này tồn tại ở đâu đó trên SO nhưng tìm kiếm của tôi havent trả lại ..

+0

có thể trùng lặp: http://stackoverflow.com/questions/1986121/match-all-urls-in-string-and-return-in- array-in-javascript – fonini

+1

Mọi người nên dừng tiền tố biến JS với '$' ... JS không phải là PHP! – helpermethod

+0

Xin lỗi- đã có đầu của tôi trong PHP cả ngày, sẽ xóa! – SW4

Trả lời

17

tôi chỉ sử dụng URI.js - giúp bạn dễ dàng.

var source = "Hello www.example.com,\n" 
    + "http://google.com is a search engine, like http://www.bing.com\n" 
    + "http://exämple.org/foo.html?baz=la#bumm is an IDN URL,\n" 
    + "http://123.123.123.123/foo.html is IPv4 and " 
    + "http://fe80:0000:0000:0000:0204:61ff:fe9d:f156/foobar.html is IPv6.\n" 
    + "links can also be in parens (http://example.org) " 
    + "or quotes »http://example.org«."; 

var result = URI.withinString(source, function(url) { 
    return "<a>" + url + "</a>"; 
}); 

/* result is: 
Hello <a>www.example.com</a>, 
<a>http://google.com</a> is a search engine, like <a>http://www.bing.com</a> 
<a>http://exämple.org/foo.html?baz=la#bumm</a> is an IDN URL, 
<a>http://123.123.123.123/foo.html</a> is IPv4 and <a>http://fe80:0000:0000:0000:0204:61ff:fe9d:f156/foobar.html</a> is IPv6. 
links can also be in parens (<a>http://example.org</a>) or quotes »<a>http://example.org</a>«. 
*/ 
12

Bạn có thể sử dụng regex từ URI.js:

// gruber revised expression - http://rodneyrehm.de/t/url-regex.html 
var uri_pattern = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig; 

String#match và hay String#replace có thể giúp ...

+0

Cảm ơn, nhưng điều này dường như không xác định, ví dụ: 'google.com' – SW4

+0

Lưu ý rằng sử dụng regex - đặc biệt này - có thể gây ra sự cố ("khắc phục thảm họa") - https://github.com/medialize/URI.js/issues/131 - Tôi sẽ đi với câu trả lời của @ chovy và sử dụng URI.withinString() – rodneyrehm

1

thử này

var expression = /[[email protected]:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[[email protected]:%_\+.~#?&//=]*)?/gi; 

bạn có thể sử dụng trang web này để kiểm tra regexp http://gskinner.com/RegExr/

+0

Cảm ơn, nhưng điều này dường như bỏ lỡ phần chuỗi truy vấn của URL .. – SW4

+0

hoạt động tốt cho tôi, cảm ơn –

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