Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.04.2018, 00:12
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

Заменить несколько тегов одним 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);

Последний раз редактировалось Ramundo, 22.04.2018 в 00:16.
Ответить с цитированием
  #2 (permalink)  
Старый 22.04.2018, 00:19
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

document.body.innerHTML = document.body.innerHTML.replace(/\[h:(.+?)\]/ig, heroLinkCode);

Последний раз редактировалось j0hnik, 22.04.2018 в 00:24.
Ответить с цитированием
  #3 (permalink)  
Старый 22.04.2018, 00:42
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

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, 22.04.2018 в 00:49.
Ответить с цитированием
  #4 (permalink)  
Старый 22.04.2018, 00:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

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>

Последний раз редактировалось рони, 22.04.2018 в 01:12.
Ответить с цитированием
  #5 (permalink)  
Старый 22.04.2018, 22:42
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

Спасибо!

Пришлось переделать под свои нужды ,
в страшное зрелище (пока что):
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, 22.04.2018 в 22:47.
Ответить с цитированием
  #6 (permalink)  
Старый 22.04.2018, 22:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

Ramundo,
if (href_name in items)
Ответить с цитированием
  #7 (permalink)  
Старый 24.09.2018, 11:56
Интересующийся
Отправить личное сообщение для Andrey_szr Посмотреть профиль Найти все сообщения от Andrey_szr
 
Регистрация: 26.02.2010
Сообщений: 22

Хотелось бы разобраться в одном вопросе:
Имею некий массив:
var arr=['Мне 23 года','Мне 26 лет','Мне 31 год']

Нужно убрать 'Мне ', ' года', ' лет' и ' год', т.е. определенный набор элементов, включая пробелы.
Каким образом осуществить замену элементов массива с помощью replace ? Сделать это поэтапно я могу, а вот как прописать условие одной строкой?
Ответить с цитированием
  #8 (permalink)  
Старый 24.09.2018, 12:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

Сообщение от Andrey_szr
Нужно убрать 'Мне ', ' года', ' лет' и ' год',
нужны цифры?
Ответить с цитированием
  #9 (permalink)  
Старый 24.09.2018, 12:07
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,748

var arr=['Мне 23 года','Мне 26 лет','Мне 31 год'];
arr=arr.join(';').replace(/[^\d;]+?/g,'').split(';');
alert(arr);
Ответить с цитированием
  #10 (permalink)  
Старый 24.09.2018, 12:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

Andrey_szr,
var arr=['Мне 23 года','Мне 26 лет','Мне 31 год'];
var num = arr.map(function (val) {
    return val.match(/\d+/)[0]
});
alert(num);

Последний раз редактировалось рони, 24.09.2018 в 13:07.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обернуть каждый тег в несколько DIV содержащих по 1 атрибуту от этих самых тегов? Zaxap Общие вопросы Javascript 10 08.11.2016 11:56
Несколько блоков под одним скриптом serdeles jQuery 3 19.09.2014 12:11
Как заменить тексты ссылок текстами из тегов span при нажатии All_ex74 Элементы интерфейса 13 28.08.2014 08:16
Заполнить несколько ComboBox одним запросом! potkin ExtJS 6 05.07.2012 22:57
Несколько селектов с одним содержанием Andres Events/DOM/Window 1 15.06.2011 22:26