Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   replace заменяет только первое вхождение (https://javascript.ru/forum/misc/33206-replace-zamenyaet-tolko-pervoe-vkhozhdenie.html)

OklickSpb 14.11.2012 01:41

replace заменяет только первое вхождение
 
Здравствуйте!
var text = $("[name='"+NameInput+"']").val();
	var result1 = text.replace("[b]", "<b>").replace("[/b]", "</b>");
	var result2 = result1.replace("[i]", "<i>").replace("[/i]", "</i>");
	var result3 = result2.replace("[u]", "<u>").replace("[/u]", "</u>");
	var result4 = result3.replace("[big]", "<big>").replace("[/big]", "</big>");
	var result5 = result4.replace("[small]", "<small>").replace("[/small]", "</small>");
	var result6 = result5.replace("[color red]", "<font color=\"red\">").replace("[/color red]", "</font>");
	var result7 = result6.replace("[img]", "<img style=\"max-width: 200px; max-height: 200px;\" src=\"").replace("[/img]", "\">");
	//retult = result.replace("[/b]", "</b>");
	$("#"+IdDiv).html(result7);

Суть проблеммы в том, что если в тексте есть только один (например [b]), то все нормально, а если несколько, то заменится только первая.
Вот пример:
//Ввели:
[b]Привет мир1![/b]
[i]Привет мир2![/i]
[u]Привет мир3![/u]
//Получили:
<b>Привет мир1!</b>
<i>Привет мир2!</i>
<u>Привет мир3!</u>

-------Все нормально-----
//Ввели:
[b]Привет мир1![/b]
[b]Привет мир2![/b]
[b]Привет мир3![/b]
//Получили:
<b>Привет мир1!</b>
[b]Привет мир2![/b] [b]Привет мир3![/b]
-------Не заменились все кроме первого ------

Как бороться?

Dmitriyff 14.11.2012 06:31

ох... где-то на хабре про это было, суть в том что, в данном случае replace ищет только первое вхождение, и заканчивает работу, пользуетесь regexp

как-то так
replace(/\[b\]/g, "<b>")

Aetae 14.11.2012 06:34

Вам надо начать с азов. Почитать справочник на этом сайте. Явно же не разбираетесь.

Вас бы наверное устроил ответ вроде: используйте вместо [b]"" - /\[b\]/g (upd как раз пока писал - предложили), но на само то деле данная задача решается иначе. Стоит погуглить, коючевые слова: bbcode javascript.

Функция на коленке, для примера:
<!DOCTYPE HTML>
<html lang="ru-RU">
<head>
	<meta charset="UTF-8">
	<title></title>
</head>
<body>
	
<textarea name="" id="text" cols="30" rows="10">
click
[b]Привет мир1![/b]
[i]Привет мир2![/i]
[u]Привет мир3![/u]

</textarea>
<script type="text/javascript">
	var text = document.getElementById('text');
var pattern = {
	'b':		['<b>','</b>'],
	'i':		['<i>','</i>'],
	'u':		['<u>','</u>'],
	'big':		['<big>','</big>'],
	'small':	['<small>','</small>'],
	'color red':['<font color="red">','</font>'],
	'img':		['<img style="max-width: 200px; max-height: 200px;" src="','">']
}



function unBB( string, pattern ){
	return string.replace( 
		/\[(\/?)([^\]]+?)\]/gi, 
		function(str, close, tag){
			if(!pattern[tag]) return str;
			
			if(close) return pattern[tag][1];
			
			return pattern[tag][0];
		}
	)
}

text.onclick = function(){
	text.value = unBB( text.value, pattern )
}
</script>
</body>
</html>


Часовой пояс GMT +3, время: 09:51.