заменить при помощи replace все вхождения строки

clevel

Новичок
заменить при помощи replace все вхождения строки

есть шаблон регулярного выражения, тип строка, который формируется динамично в процессе выполнения скрипта.
Необходимо заменить все вхождения данной строки в шаблоне при помощи jscipt. В MSDN, поиск по форуме глядел, нашел следующее:
re = new RegExp("pattern", ["flags"]), где pattern может быть строкой... однако у меня данная конструкция либо воообще не работает (выдает как всегда в jscript левые ошибки), либо не выполняет замену в принципе.
вот рабочий паттерн:
'class='+stl[0][stl[2]]+'\('+stl[3]+'\)', принимает значение, например, class=Строка(Подробнее);
где stl - массив с данными, которые динамично формируется и в цикле происходит создание паттерна и замена всех вхождений в исходную строку.
Сейчас использую просто данный паттерн в sourse.replace(pattern,newstring), но заменяется ТОЛЬКО ПЕРВОЕ ВХОЖДЕНИЕ СТРОКИ!
Подскажите, как заменить все вхождения паттерна в исходный текст
 

Crazy

Developer
Обрати внимание на флаги. Разве в том же MSDN про них не написали?
 

clevel

Новичок
флаг g должен вроде спасти, но!
Исползую так:
1.re = new RegExp('class='+stl[0][stl[2]]+'\('+stl[3]+'\)', "g")
sourse.replace(re,newstring)
ничего не заменяется
2.re = new RegExp('class='+stl[0][stl[2]]+'\('+stl[3]+'\)')
sourse.replace(re,newstring)
ничего не заменяется
что не так?
 

clevel

Новичок
да, если использую несколько флагов одновремено, начинает "левые" ошибки выдавать при попытке выполнить данную операцию... ослик у меня 5.0, сейчас делаю скрипт и тестю под ним, потом буду проверять под 5.5. и 6.0
надо. чтобы под всеми ними работало нормально...
думаю над вариантом в цикле искать эту строку и если найдена, заменять... но это плохое решение, имхо...
а вот нормально чего-то не выходит...
подскажите, что не так..
П.С. что такое флаги, я смотрел, ман(MSDN) на несколько раз проштудировал.. поэтому просьба,помогите именно дельным советом!
 

Profic

just Profic (PHP5 BetaTeam)
Флаг g появился только в JavaScript 1.5 (судя по мануалу нетскаповскому).
Вот эта вещь работает всюду (где тестил), но она не thread safe :(
PHP:
/*
makes original replace function allow multiline replaces (not thread-safe)
*/
String.prototype.replaceMulti = function (pattern, replace) {
	multilineSave = RegExp.multiline;
	RegExp.multiline = true;
	var retVal = this.replace (pattern, replace);
	RegExp.multiline = multilineSave;
	return retVal;
}
юзать в виде
var newstr = oldstr.replaceMulti (/search/, 'replace');
в newstr будет новая строка.
 

clevel

Новичок
в чистом виде выдает левые ошибки, привел к такому виду:
function replaceMulti(pattern, replace){
var multilineSave=RegExp.multiline;
RegExp.multiline=true;
var retVal=this.replace(pattern, replace);
RegExp.multiline=multilineSave;
return retVal;
}
String.prototype.replaceMulti=replaceMulti;
rs=rs.replaceMulti('class='+stl[0][stl[2]]+'\('+stl[3]+'\)','class='+stl[5][stl[2]]+stl[1]);
заменяет по прежнему первое вхождение строки... :(
в MSDN не нашел RegExp.multiline. Что это такое? недокументированные возможности?
 

Profic

just Profic (PHP5 BetaTeam)
Ну я не MSDN пользовался, а нетскаповским референс мануалом. Почитай где-то на developer.netscape.com :)

Глобальный объект RegExp определяет некоторый свойства, которые принадлежат всем экземплярас класса RegExp... вот....

ээээ... тебе нужен global :) но, фишка в том, что реализации разные, почитай реф мануал от нескапы. Там описаны все эти свойства
 

clevel

Новичок
стоп! это ман от Нетскейп, а я под осликом...
если проблема в глобалс, то я вынес операцию присвоения RegExp.multiline=true; за функцую, ничего не изменилось :(
 

clevel

Новичок
смотрю MSDN, там global property,ignoreCase Property,multiline -Read-only.
Дв и версия Version 5.5
Не катит :(
 

clevel

Новичок
вышел из ситуации следующим образом:
PHP:
function multireplace(pat,to,rs){
 var fnd=0;
  while(fnd>=0){
    rs=rs.replace(pat,to);
    fnd=rs.lastIndexOf(pat);
  }
  return rs;
}
 

eddie

Новичок
.replace("oldValue","newValue") заменяет только первое вхождение

.replace(/oldValue/g,"newValue") заменяет все

проверено опытным путем -- сам на этом обломался
 

clevel

Новичок
.replace("oldValue","newValue") заменяет только первое вхождение

.replace(/oldValue/g,"newValue") заменяет все

проверено опытным путем -- сам на этом обломался
да это ясно, если oldValue объект RegExp, а если строка?
то, что ты предлагаешь, я пытался использовать еще до того, как создать топик.
читай первые посты
 

Profic

just Profic (PHP5 BetaTeam)
сорри уже ухожу домой, вот это у меня в IE 6, Mozilla 1.3 и Opera 7.0 работает, т.е. заменяет

<script language="JavaScript1.2">
var a = "test test\ntest test";
var search = new RegExp ("test", "gm");
var b = a.replace(search, "somestr");
alert (b);
</script>
Попробуй. Все-таки цикл выход - но крайне кривой
 
Сверху