- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
function str_replace ( search, replace, subject ) { // Replace all occurrences of the search string with the replacement string
//
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Gabriel Paderni
if(!(replace instanceof Array)){
replace=new Array(replace);
if(search instanceof Array){//If search is an array and replace is a string, then this replacement string is used for every value of search
while(search.length>replace.length){
replace[replace.length]=replace[0];
}
}
}
if(!(search instanceof Array))search=new Array(search);
while(search.length>replace.length){//If replace has fewer values than search , then an empty string is used for the rest of replacement values
replace[replace.length]='';
}
if(subject instanceof Array){//If subject is an array, then the search and replace is performed with every entry of subject , and the return value is an array as well.
for(k in subject){
subject[k]=str_replace(search,replace,subject[k]);
}
return subject;
}
for(var k=0; k<search.length; k++){
var i = subject.indexOf(search[k]);
while(i>-1){
subject = subject.replace(search[k], replace[k]);
i = subject.indexOf(search[k],i);
}
}
return subject;
}
function str_replace(search, replace, subject) { return subject.split(search).join(replace);}
guest 23.03.2010 02:59 # 0
guest 23.03.2010 12:06 # −0.4
guest 23.03.2010 15:43 # +1.2
DrFreez 23.03.2010 16:41 # +0.2
babaika 23.03.2010 18:57 # 0
И оригинал зачем-то принимает аргументами массивы, вы не пробовали строку массивом разбить?
guest 24.03.2010 12:36 # +5
1) строка поиска или массив таких строк;
2) строка замены или массив таких строк, смежный с массивом строк поиска;
3) строка, в которой будет производиться замена (не изменяется).
Если идёт замена строки на строку, вариант с subject.split(search).join(replace) абсолютно верен. Если идёт замена по массиву - она происходит в несколько проходов, на каждом из которых происходит замена очередной подстроки очередной подстрокой (или одной и той же). Это значит, что str_replace(["a", "b", "c"], ["b", "c", "d"], "abcd") == "dddd" (итерации: "bcdd", "cddd", "dddd"), вариант с .split(search).join(replace) терпит FAIL.
Вывод:
1) не говнокод, а авторская задумка.
2) запостившему перед тем, как постить, надо разуть глаза и поинтересоваться, для чего нужно и как должно работать то, что он постит. Тем, кто повёлся - внимательнее раскуривать код.
Так-то.
guest 26.03.2010 18:46 # −1.8
В самом жестоком варианте, если, например, регексп по какой-то причине не поддерживается (ну 20 лет назад такое было кажется...), то, опять же, оптимальный вариант делать такие замены в один проход + FSM (что по сути и является имитацией того, что делает регексп), а никак ни черззаборногузадерические тучи циклов и split-join. Split-join плодит тучу строковых констант в пуле и поэтому сильно засоряет память виртуальной машины - виртуальная машина напрягается в смысле менеджмента памяти, врезультате имеем код, который кроме того, что работает медленно, еще и работает с очень разной скоростью, зависящей только от конкретного текущего состояния памяти делегированой виртуальной машине. (Усложняет профайлинг и определение участков программы критичных к производительности).