Заменить несколько тегов одним replace'ом
Помогите пожалуйста составить регулярку, которая бы глобально заменяла в тексте
[h:значение] на '<a href = "/heroes/view/' + значение + '">' + значение +'</a>', а также [i:значение] на '<a href = "/items/view/' + значение + '">' + значение +'</a>'. Если, конечно , такое воможно. У меня получилось только заменить 1 тег за один replace: function itemLinkCode(match, name){ name = trim(name); name = name.replace(/ /g, '_'); return '<a href = "/heroes/view/' + name + '">' + name +'</a>'; } d1.innerHTML = d1.innerHTML.replace(/\[h:(.+?)\]/ig, heroLinkCode); |
document.body.innerHTML = document.body.innerHTML.replace(/\[h:(.+?)\]/ig, heroLinkCode); |
j0hnik, я имею ввиду не заменить все вхождения одного тега, а заменить одной регуляркой два вида тегов.
Например, есть текст [h:abaddon] fgdfgdfg [h:slark] fgfdgdfgdfgdf [i:shadowblade], dvdfgdfg [i:tango]. Хотелось бы за один проход сделать из этого <a href = "/heroes/view/abaddon">abaddon</a> fgdfgdfg <a href = "/heroes/view/slark">slark</a> fgfdgdfgdfgdf<a href = "/items/view/shadowblade">shadowblade</a>, dvdfgdfg <a href = "/items/view/tango">tango</a> Я читал, что вроде быстрее одним разом делать |
Ramundo,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> </head> <body> <div id="d1">[h:значение y] [i:значение x] [h:abaddon] fgdfgdfg [h:slark] fgfdgdfgdfgdf [i:shadowblade], dvdfgdfg [i:tango].</div> <script> function LinkCode(match, folder, name){ var obj = {i : "items", h : "heroes"}; folder = obj[folder] || folder; var url = "/"+ folder +"/view/" + encodeURI(name); return '<a href = "'+url+'">' + name +'</a>'; } document.querySelector("#d1").innerHTML = document.querySelector("#d1").innerHTML.replace(/\[(\S):([^\]]+)\]/ig, LinkCode); </script> </body> </html> |
Спасибо!
Пришлось переделать под свои нужды , в страшное зрелище (пока что): function parser(match, folder, name, size){ if (typeof(size) == 'undefined'){ size = 70; } else if (size >200){ size = 200; } else{ size = trim(size); size = size.replace(/\s/g, ''); } name = trim(name); var href_name = name.toLowerCase(); //alert(href_name); href_name = href_name.replace(/\s/g, '_'); var src_name = name.replace(/\s/g, '-'); var title = name.charAt(0).toUpperCase() + name.slice(1); if (folder == 'h'){ if (typeof(heroes[href_name]) != 'undefined'){ return '<a class = "hero_tooltip" data-id = "' + heroes[href_name] + '" href = "/heroes/view/' + href_name + '"><img src = "/images/heroes/66x66/' + src_name + '.png" >' + title + '</a>'; } else{return match;} } else if (folder === 'i'){ if (typeof(items[href_name]) ==='number'){ return '<a class = "item_tooltip" data-id = "' + items[href_name] + '" href = "/items/view/' + href_name + '"><img src = "/images/items/40x29/' + href_name + '.png" >' + title + '</a>'; } else{return match;} } else if (folder == '#h'){ if (typeof(heroes[href_name]) != 'undefined'){ return '<a href = "/heroes/view/' + href_name + '"><img width = "' + size + '" height = "' + size + '" class = "hero_tooltip" data-id = "' + heroes[href_name] + '" src = "/images/heroes/66x66/' + src_name + '.png" ></a>'; } else{return match;} } else if (folder == '#i'){ if (typeof(items[href_name]) != 'undefined'){ return '<a href = "/items/view/' + href_name + '"><img width = "' + size + '" height = "' + size + '" class = "item_tooltip" data-id = "' + items[href_name] + '" src = "/images/items/40x29/' + href_name + '.png" ></a>'; } else {return match;} } else{return match;} } d1.innerHTML = d1.innerHTML.replace(/\[([#hi]{1,2})=([a-zA-z\'\-\ ]{2,})(?: size=([0-9\ ]{1,3}))?\]/ig, parser); heroes и items - это объекты вида var heroes = {"abaddon": 1, "alchemist": 2, "ancient_apparition": 3, "anti-mage": 4, "arc_warden": 5, "axe": 6, "bane": 7, "batrider": 8, "beastmaster": 9, "bloodseeker": 10, "bounty_hunter": 11, "brewmaster": 12, "bristleback": 13, "broodmother": 14 ... } и я проверяю наличие имени героя/предмета в объекте таким способом: if (typeof(items[href_name]) === 'number') или if (typeof(items[href_name]) !== "undefined"), что, наверное, убого. Подскажи, пожалуйста, как правильно проверять в таком случае? И еще, хотел спросить - обращение к свойству объекта, у которого 500 свойств, по скорости сильно отличается от обращению к объекту, у которого 10?) |
Ramundo,
if (href_name in items) |
Хотелось бы разобраться в одном вопросе:
Имею некий массив: var arr=['Мне 23 года','Мне 26 лет','Мне 31 год'] Нужно убрать 'Мне ', ' года', ' лет' и ' год', т.е. определенный набор элементов, включая пробелы. Каким образом осуществить замену элементов массива с помощью replace ? Сделать это поэтапно я могу, а вот как прописать условие одной строкой? |
Цитата:
|
var arr=['Мне 23 года','Мне 26 лет','Мне 31 год']; arr=arr.join(';').replace(/[^\d;]+?/g,'').split(';'); alert(arr); |
Andrey_szr,
var arr=['Мне 23 года','Мне 26 лет','Мне 31 год']; var num = arr.map(function (val) { return val.match(/\d+/)[0] }); alert(num); |
Часовой пояс GMT +3, время: 22:16. |