Phát hiện URL trong văn bản bằng JavaScript


151

Có ai có đề xuất để phát hiện URL trong một chuỗi các chuỗi không?

arrayOfStrings.forEach(function(string){
  // detect URLs in strings and do something swell,
  // like creating elements with links.
});

Cập nhật: Tôi sử dụng regex này để phát hiện liên kết Rõ ràng vài năm sau đó.

kLINK_DETECTION_REGEX = /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi

Trình trợ giúp đầy đủ (có hỗ trợ Tay lái tùy chọn) nằm ở ý chính # 1654670 .


11
Có lẽ không nên thử liệt kê ra một bộ TLD hữu hạn, vì chúng tiếp tục tạo ra những cái mới.
Maxy-B

Đồng ý. Đôi khi chúng ta cần là mã có thể cập nhật với TLD. Trên thực tế có thể xây dựng tập lệnh để nối TLD vào regex hoặc TLD cập nhật mã động trong mã. Có những thứ trong cuộc sống có nghĩa là được tiêu chuẩn hóa như TLD và Timezone. Kiểm soát hữu hạn có thể tốt để xác minh URL có thể xác minh "TLD" hiện tại cho trường hợp sử dụng địa chỉ Real World.
Edward Chan JW

Câu trả lời:


217

Trước tiên, bạn cần một regex tốt phù hợp với url. Điều này thật khó để làm. Xem ở đây , ở đâyở đây :

... hầu như mọi thứ đều là một URL hợp lệ. Có một số quy tắc chấm câu để tách nó lên. Không có dấu chấm câu, bạn vẫn có một URL hợp lệ.

Kiểm tra RFC cẩn thận và xem liệu bạn có thể tạo URL "không hợp lệ" không. Các quy tắc rất linh hoạt.

Ví dụ: :::::một URL hợp lệ. Con đường là thế ":::::". Một tên tệp khá ngu ngốc, nhưng một tên tệp hợp lệ.

Ngoài ra, /////là một URL hợp lệ. Netloc ("tên máy chủ") là "". Con đường là thế "///". Một lần nữa, ngu ngốc. Cũng hợp lệ. URL này bình thường hóa "///" tương đương.

Một cái gì đó như "bad://///worse/////" là hoàn toàn hợp lệ. Ngốc nhưng hợp lệ.

Dù sao, câu trả lời này không có nghĩa là cung cấp cho bạn regex tốt nhất mà là bằng chứng về cách thực hiện gói chuỗi bên trong văn bản, bằng JavaScript.

OK, vậy hãy sử dụng cái này: /(https?:\/\/[^\s]+)/g

Một lần nữa, đây là một regex xấu . Nó sẽ có nhiều dương tính giả. Tuy nhiên, nó đủ tốt cho ví dụ này.

function urlify(text) {
  var urlRegex = /(https?:\/\/[^\s]+)/g;
  return text.replace(urlRegex, function(url) {
    return '<a href="' + url + '">' + url + '</a>';
  })
  // or alternatively
  // return text.replace(urlRegex, '<a href="$1">$1</a>')
}

var text = 'Find me at http://www.example.com and also at http://stackoverflow.com';
var html = urlify(text);

console.log(html)

// html now looks like:
// "Find me at <a href="http://www.example.com">http://www.example.com</a> and also at <a href="http://stackoverflow.com">http://stackoverflow.com</a>"

Vì vậy, trong tổng số thử:

$$('#pad dl dd').each(function(element) {
    element.innerHTML = urlify(element.innerHTML);
});

4
Một số ví dụ về "nhiều tích cực sai" sẽ cải thiện đáng kể câu trả lời này. Mặt khác, nhân viên Google trong tương lai chỉ còn lại một số FUD (có thể hợp lệ?).
cmcculloh

Tôi không bao giờ biết bạn có thể truyền chức năng như param thứ hai cho .replace: |
Aamir Afridi

4
Điều đó tốt, nhưng nó làm điều "sai" với dấu chấm câu text="Find me at http://www.example.com, and also at http://stackoverflow.com."dẫn đến hai 404s. Một số người dùng nhận thức được điều này và sẽ thêm khoảng trắng sau URL trước dấu chấm câu để tránh bị hỏng, nhưng hầu hết các trình liên kết tôi sử dụng (Gmail, etherpad, máy tạo mẫu) dấu chấm câu riêng biệt từ URL.
skierpage

Trong trường hợp văn bản đã chứa url neo, bạn có thể sử dụng hàm removeAnchors (văn bản) {var div = $ ('<div> </ div>'). Html (văn bản); div.find ('a'). nội dung (). unsrap (); trả về div.text (); } để xóa neo trước khi trả về text.replace
Muneeb Mirza

Nếu văn bản đã chứa url neo, bạn đang sử dụng jquery để xóa neo, nhưng tôi đang sử dụng Angular. Làm thế nào tôi có thể loại bỏ neo trong Angular?
Sachin Jagtap

132

Đây là những gì tôi đã kết thúc bằng cách sử dụng như regex của mình:

var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;

Điều này không bao gồm dấu chấm câu trong URL. Chức năng của Crescent hoạt động như một bùa mê :) vì vậy:

function linkify(text) {
    var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(urlRegex, function(url) {
        return '<a href="' + url + '">' + url + '</a>';
    });
}

4
Cuối cùng một regex thực sự hoạt động trong trường hợp rõ ràng nhất! Điều này xứng đáng được đánh dấu. Tôi đã thử nghiệm hàng ngàn ví dụ từ tìm kiếm googles cho đến khi tôi tìm thấy điều này.
Ismael

6
Đơn giản và tốt đẹp! Nhưng urlRegexnên được định nghĩa bên ngoài linkify là biên dịch nó là tốn kém.
BM

1
Điều này không thể phát hiện URL đầy đủ: disney.wikia.com/wiki/Pua_(Moana)
Jry9972

1
Tôi đã thêm ()vào mỗi danh sách các ký tự và nó hoạt động ngay bây giờ.
Guillaume F.

3
nó không thể phát hiện một url bắt đầu chỉ bằng www. ví dụ: www.facebook.com
CraZyDroiD

51

Tôi đã giải quyết vấn đề này khá lâu, sau đó tôi nhận ra rằng có một phương thức Android, android.text.util.Linkify, sử dụng một số regex khá mạnh mẽ để thực hiện điều này. May mắn thay, Android là nguồn mở.

Họ sử dụng một vài mẫu khác nhau để phù hợp với các loại url khác nhau. Bạn có thể tìm thấy tất cả chúng ở đây: http://grepcode.com/file/reposective.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/util/Regex.java#Regex. 0weB_URL_PATTERN

Nếu bạn chỉ quan tâm đến các url khớp với WEB_URL_PATTERN, nghĩa là các url phù hợp với thông số RFC 1738, bạn có thể sử dụng điều này:

/((?:(http|https|Http|Https|rtsp|Rtsp):\/\/(?:(?:[a-zA-Z0-9\$\-\_\.\+\!\*\'\(\)\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,64}(?:\:(?:[a-zA-Z0-9\$\-\_\.\+\!\*\'\(\)\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,25})?\@)?)?((?:(?:[a-zA-Z0-9][a-zA-Z0-9\-]{0,64}\.)+(?:(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(?:biz|b[abdefghijmnorstvwyz])|(?:cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(?:edu|e[cegrstu])|f[ijkmor]|(?:gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(?:info|int|i[delmnoqrst])|(?:jobs|j[emop])|k[eghimnrwyz]|l[abcikrstuvy]|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])|(?:name|net|n[acefgilopruz])|(?:org|om)|(?:pro|p[aefghklmnrstwy])|qa|r[eouw]|s[abcdeghijklmnortuvyz]|(?:tel|travel|t[cdfghjklmnoprtvwz])|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]))|(?:(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])))(?:\:\d{1,5})?)(\/(?:(?:[a-zA-Z0-9\;\/\?\:\@\&\=\#\~\-\.\+\!\*\'\(\)\,\_])|(?:\%[a-fA-F0-9]{2}))*)?(?:\b|$)/gi;

Dưới đây là toàn văn của nguồn:

"((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)"
+ "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_"
+ "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?"
+ "((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+"   // named host
+ "(?:"   // plus top level domain
+ "(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])"
+ "|(?:biz|b[abdefghijmnorstvwyz])"
+ "|(?:cat|com|coop|c[acdfghiklmnoruvxyz])"
+ "|d[ejkmoz]"
+ "|(?:edu|e[cegrstu])"
+ "|f[ijkmor]"
+ "|(?:gov|g[abdefghilmnpqrstuwy])"
+ "|h[kmnrtu]"
+ "|(?:info|int|i[delmnoqrst])"
+ "|(?:jobs|j[emop])"
+ "|k[eghimnrwyz]"
+ "|l[abcikrstuvy]"
+ "|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])"
+ "|(?:name|net|n[acefgilopruz])"
+ "|(?:org|om)"
+ "|(?:pro|p[aefghklmnrstwy])"
+ "|qa"
+ "|r[eouw]"
+ "|s[abcdeghijklmnortuvyz]"
+ "|(?:tel|travel|t[cdfghjklmnoprtvwz])"
+ "|u[agkmsyz]"
+ "|v[aceginu]"
+ "|w[fs]"
+ "|y[etu]"
+ "|z[amw]))"
+ "|(?:(?:25[0-5]|2[0-4]" // or ip address
+ "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]"
+ "|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]"
+ "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
+ "|[1-9][0-9]|[0-9])))"
+ "(?:\\:\\d{1,5})?)" // plus option port number
+ "(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~"  // plus option query params
+ "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?"
+ "(?:\\b|$)";

Nếu bạn muốn thực sự ưa thích, bạn cũng có thể kiểm tra địa chỉ email. Regex cho địa chỉ email là:

/[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}\\@[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}(\\.[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25})+/gi

PS: Các tên miền cấp cao nhất được hỗ trợ bởi regex ở trên hiện tại kể từ tháng 6 năm 2007. Để có danh sách cập nhật, bạn cần kiểm tra https://data.iana.org/TLD/tlds-alpha-by-domain.txt .


3
Vì bạn có biểu thức chính quy không phân biệt chữ hoa chữ thường, bạn không phải chỉ định a-zA-Zhttp|https|Http|Https|rtsp|Rtsp.
Ry-

4
Điều này là tốt, nhưng tôi không chắc chắn tôi đã từng sử dụng nó. Đối với hầu hết các trường hợp sử dụng, tôi muốn chấp nhận một số dương tính giả hơn là sử dụng một cách tiếp cận dựa trên danh sách TLD được mã hóa cứng. Nếu bạn liệt kê các TLD trong mã của mình, bạn sẽ đảm bảo rằng nó sẽ bị lỗi thời vào một ngày nào đó và tôi không muốn xây dựng bảo trì bắt buộc trong tương lai vào mã của mình nếu tôi có thể tránh được.
Đánh dấu Amery

3
Điều này hoạt động 101% thời gian, thật không may, nó cũng tìm thấy các url không có trước một khoảng trắng. Nếu tôi chạy một trận đấu trên hello@mydomain.com, nó sẽ bắt 'mydomain.com'. Có cách nào để cải thiện điều này chỉ để bắt nó nếu nó có một khoảng trống trước nó?
Deminetix

Cũng cần lưu ý, điều này là hoàn hảo để bắt người dùng nhập url
Deminetix

Lưu ý rằng grepcode.com không còn hoạt động nữa, đây là những gì tôi nghĩ là một liên kết đến đúng nơi trong mã nguồn Android. Tôi nghĩ rằng regex Android đang sử dụng có thể được cập nhật từ năm 2013 (bài gốc), nhưng dường như không được cập nhật từ năm 2015 và do đó có thể thiếu một số TLD mới hơn.
James

19

Dựa trên câu trả lời của Crescent Fresh

nếu bạn muốn phát hiện các liên kết với http: // HOẶC không có http: // và bởi www. bạn có thể sử dụng như sau

function urlify(text) {
    var urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g;
    //var urlRegex = /(https?:\/\/[^\s]+)/g;
    return text.replace(urlRegex, function(url,b,c) {
        var url2 = (c == 'www.') ?  'http://' +url : url;
        return '<a href="' +url2+ '" target="_blank">' + url + '</a>';
    }) 
}

Đây là một giải pháp tốt, nhưng tôi cũng muốn kiểm tra văn bản đó không nên có href trong đó. Tôi đã thử regex này = /((?!href)((https?:\/\/)|(www\.) Bạn có thể giúp tôi với nó hoặc tại sao regex ở trên không hoạt động.
Sachin Jagtap

Tôi thích rằng bạn cũng đã thêm target = "_ blank" vào đầu ra được trả về. Phiên bản này là những gì tôi muốn. Không có gì quá vượt trội (nếu không tôi sẽ sử dụng Linkifyjs) chỉ đủ để có được hầu hết các liên kết.
Michael Kubler

18

Thư viện này trên NPM có vẻ như khá toàn diện https://www.npmjs.com/package/linkifyjs

Linkify là một plugin JavaScript nhỏ nhưng toàn diện để tìm URL ở dạng văn bản thuần và chuyển đổi chúng thành các liên kết HTML. Nó hoạt động với tất cả các URL và địa chỉ email hợp lệ.


4
Tôi vừa hoàn thành việc thực hiện linkifyjs trong dự án của mình và thật tuyệt vời. Linkifyjs nên là câu trả lời cho câu hỏi này. Một cái khác để xem là github.com/twitter/twitter-text
Uber Schnoz

6

Chức năng có thể được cải thiện hơn nữa để hiển thị hình ảnh là tốt:

function renderHTML(text) { 
    var rawText = strip(text)
    var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   

    return rawText.replace(urlRegex, function(url) {   

    if ( ( url.indexOf(".jpg") > 0 ) || ( url.indexOf(".png") > 0 ) || ( url.indexOf(".gif") > 0 ) ) {
            return '<img src="' + url + '">' + '<br/>'
        } else {
            return '<a href="' + url + '">' + url + '</a>' + '<br/>'
        }
    }) 
} 

hoặc cho một hình ảnh thu nhỏ liên kết đến hình ảnh kích thước rực rỡ:

return '<a href="' + url + '"><img style="width: 100px; border: 0px; -moz-border-radius: 5px; border-radius: 5px;" src="' + url + '">' + '</a>' + '<br/>'

Và đây là hàm dải () xử lý trước chuỗi văn bản để thống nhất bằng cách xóa mọi html hiện có.

function strip(html) 
    {  
        var tmp = document.createElement("DIV"); 
        tmp.innerHTML = html; 
        var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   
        return tmp.innerText.replace(urlRegex, function(url) {     
        return '\n' + url 
    })
} 

2
let str = 'https://example.com is a great site'
str.replace(/(https?:\/\/[^\s]+)/g,"<a href='$1' target='_blank' >$1</a>")

Mã ngắn Công việc lớn! ...

Kết quả:-

 <a href="https://example.com" target="_blank" > https://example.com </a>

1

Có gói npm hiện có: url-regex , chỉ cần cài đặt nó với yarn add url-regexhoặc npm install url-regexsử dụng như sau:

const urlRegex = require('url-regex');

const replaced = 'Find me at http://www.example.com and also at http://stackoverflow.com or at google.com'
  .replace(urlRegex({strict: false}), function(url) {
     return '<a href="' + url + '">' + url + '</a>';
  });

0

tmp.innerText không xác định. Bạn nên sử dụng tmp.innerHTML

function strip(html) 
    {  
        var tmp = document.createElement("DIV"); 
        tmp.innerHTML = html; 
        var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   
        return tmp.innerHTML .replace(urlRegex, function(url) {     
        return '\n' + url 
    })

0

thử cái này:

function isUrl(s) {
    if (!isUrl.rx_url) {
        // taken from https://gist.github.com/dperini/729294
        isUrl.rx_url=/^(?:(?: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;
        // valid prefixes
        isUrl.prefixes=['http:\/\/', 'https:\/\/', 'ftp:\/\/', 'www.'];
        // taken from https://w3techs.com/technologies/overview/top_level_domain/all
        isUrl.domains=['com','ru','net','org','de','jp','uk','br','pl','in','it','fr','au','info','nl','ir','cn','es','cz','kr','ua','ca','eu','biz','za','gr','co','ro','se','tw','mx','vn','tr','ch','hu','at','be','dk','tv','me','ar','no','us','sk','xyz','fi','id','cl','by','nz','il','ie','pt','kz','io','my','lt','hk','cc','sg','edu','pk','su','bg','th','top','lv','hr','pe','club','rs','ae','az','si','ph','pro','ng','tk','ee','asia','mobi'];
    }

    if (!isUrl.rx_url.test(s)) return false;
    for (let i=0; i<isUrl.prefixes.length; i++) if (s.startsWith(isUrl.prefixes[i])) return true;
    for (let i=0; i<isUrl.domains.length; i++) if (s.endsWith('.'+isUrl.domains[i]) || s.includes('.'+isUrl.domains[i]+'\/') ||s.includes('.'+isUrl.domains[i]+'?')) return true;
    return false;
}

function isEmail(s) {
    if (!isEmail.rx_email) {
        // taken from http://stackoverflow.com/a/16016476/460084
        var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
        var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
        var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
        var sQuotedPair = '\\x5c[\\x00-\\x7f]';
        var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
        var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
        var sDomain_ref = sAtom;
        var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
        var sWord = '(' + sAtom + '|' + sQuotedString + ')';
        var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
        var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
        var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
        var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

        isEmail.rx_email = new RegExp(sValidEmail);
    }

    return isEmail.rx_email.test(s);
}

cũng sẽ nhận ra các url như google.com, http://www.google.bla, http://google.bla, www.google.blanhưng khônggoogle.bla


0

Bạn có thể sử dụng biểu thức chính quy như thế này để trích xuất các mẫu url bình thường.

(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})

Nếu bạn cần các mẫu phức tạp hơn, hãy sử dụng một thư viện như thế này.

https://www.npmjs.com/package/potype-dreamer


Mục đích của nó là (?:www\.|(?!www))gì? Tại sao nên wwwww.comkhông hợp lệ?
Toto

Bạn đúng rồi. Thật ra tôi chỉ lấy nó khi nhiều người sử dụng regex. Tôi khuyên bạn nên sử dụng thư viện được liên kết ở trên. Chúng ta nên xem xét nhiều trường hợp trong phát hiện url, vì vậy regex sẽ phức tạp hơn.
Kang Andrew

0

Giải pháp hướng đối tượng chung

Đối với những người như tôi sử dụng các khung như góc không cho phép thao tác trực tiếp với DOM, tôi đã tạo một hàm lấy một chuỗi và trả về một mảng url/ plainTextcác đối tượng có thể được sử dụng để tạo bất kỳ biểu diễn UI nào bạn muốn.

Regex URL

Đối với kết hợp URL tôi đã sử dụng h0mayunregex (hơi thích nghi) :/(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g

Hàm của tôi cũng loại bỏ các ký tự dấu chấm câu từ cuối URL như thế .,tôi tin rằng thông thường sẽ là dấu chấm câu thực sự hơn là một kết thúc URL hợp pháp (nhưng có thể! Đây không phải là khoa học nghiêm ngặt như các câu trả lời khác giải thích tốt) theo regex vào các URL phù hợp /^(.+?)([.,?!'"]*)$/.

Mã bản in

    export function urlMatcherInText(inputString: string): UrlMatcherResult[] {
        if (! inputString) return [];

        const results: UrlMatcherResult[] = [];

        function addText(text: string) {
            if (! text) return;

            const result = new UrlMatcherResult();
            result.type = 'text';
            result.value = text;
            results.push(result);
        }

        function addUrl(url: string) {
            if (! url) return;

            const result = new UrlMatcherResult();
            result.type = 'url';
            result.value = url;
            results.push(result);
        }

        const findUrlRegex = /(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g;
        const cleanUrlRegex = /^(.+?)([.,?!'"]*)$/;

        let match: RegExpExecArray;
        let indexOfStartOfString = 0;

        do {
            match = findUrlRegex.exec(inputString);

            if (match) {
                const text = inputString.substr(indexOfStartOfString, match.index - indexOfStartOfString);
                addText(text);

                var dirtyUrl = match[0];
                var urlDirtyMatch = cleanUrlRegex.exec(dirtyUrl);
                addUrl(urlDirtyMatch[1]);
                addText(urlDirtyMatch[2]);

                indexOfStartOfString = match.index + dirtyUrl.length;
            }
        }
        while (match);

        const remainingText = inputString.substr(indexOfStartOfString, inputString.length - indexOfStartOfString);
        addText(remainingText);

        return results;
    }

    export class UrlMatcherResult {
        public type: 'url' | 'text'
        public value: string
    }

0

Nếu bạn muốn phát hiện các liên kết với http: // HOẶC không có http: // HOẶC ftp HOẶC các trường hợp có thể khác như xóa dấu chấm câu ở cuối, hãy xem mã này.

https://jsfiddle.net/AndrewKang/xtfjn8g3/

Một cách đơn giản để sử dụng đó là sử dụng NPM

npm install --save url-knife
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.