我有一段代碼試圖找到 URL 并將它們包裝在<a>標簽中。它適用于較短的字串,但在較長的字串上它根本不起作用。有誰知道為什么?
function urlify(text) {
var urlRegex = `/(([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`
return text.replace(urlRegex, function(url) {
return '<a href="' url '">' url '</a>';
});
}
如果我運行urlify('www.example.com is a cool website')它會回傳<a href="www.example.com">www.example.com</a> is a cool website,但如果我有一個包含 5000 個字符且包含鏈接的字串,它根本不會更改原始字串。
uj5u.com熱心網友回復:
這是相同正則運算式的更有效版本:
function urlify(text) {
var urlRegex = /(?:[a-z] :\/\/)?(?:[a-z\d-] \.) (?:a(?:ero|rpa)|biz|co(?:m|op)|edu|gov|in(?:ternal|fo|t)|jobs|m(?:il|useum)|n(?:a(?:me|to)|et)|org|pro|travel|local|[a-z]{2})(?::\d{1,5})?(?:\/[\w.~-] )*(?:\/[\w.-]*(?:\?[\w .%=&;-]*)?)?(?:#[\w!$&'()* .=~:@\/?-]*)?(?!\S)/gi
return text.replace(urlRegex, '<a href="$&">$&</a>');
}
請參閱正則運算式演示。
目前難以優化的部分是開頭(?:[a-z] :\/\/)?(?:[a-z\d-] \.) ,因為這允許匹配字串中任何位置的未知長度的模式,這涉及相當多的開銷。如果您只想從空格或字串開頭開始匹配,(?<!\S)則開頭的 a 將大大加快匹配速度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/454894.html
標籤:javascript html 正则表达式 网址 代替
上一篇:如何格式化字串選擇?
