ЙажаСценарий / Говнокод #2843 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 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);}

Запостил: DrFreez DrFreez, (Updated )

Комментарии (7) RSS

  • Да, да, как раз недавно находил эти обе функции.
    Ответить
  • А ничего, что оригинальная функция умеет немного больше? Как я вижу она умеет менять все "aa" -> "a" и все "bb" -> "b" за один проход. Или например умеет менять "aa", "ab" и "ac" в "a".
    Ответить
      • Поддерживает, но немного не так, как репласе - попробуйте регулярку со скобками, например.
        И оригинал зачем-то принимает аргументами массивы, вы не пробовали строку массивом разбить?
        Ответить
  • Эта функция входит в состав phpjs и имитирует работу PHP-функции str_replace() (см. http://php.net/str_replace ). Последней на вход подаются три аргумента:
    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) запостившему перед тем, как постить, надо разуть глаза и поинтересоваться, для чего нужно и как должно работать то, что он постит. Тем, кто повёлся - внимательнее раскуривать код.
    Так-то.
    Ответить
  • функция говнистая только потому, что все то же самое можно сделать регекспом, и не нужно совать туда массив, это медленно и противоестесственно. Наличие такой говнистой сигнатуры в том же PHP или любом другом языке не делает ее ни капельки лучше.
    В самом жестоком варианте, если, например, регексп по какой-то причине не поддерживается (ну 20 лет назад такое было кажется...), то, опять же, оптимальный вариант делать такие замены в один проход + FSM (что по сути и является имитацией того, что делает регексп), а никак ни черззаборногузадерические тучи циклов и split-join. Split-join плодит тучу строковых констант в пуле и поэтому сильно засоряет память виртуальной машины - виртуальная машина напрягается в смысле менеджмента памяти, врезультате имеем код, который кроме того, что работает медленно, еще и работает с очень разной скоростью, зависящей только от конкретного текущего состояния памяти делегированой виртуальной машине. (Усложняет профайлинг и определение участков программы критичных к производительности).
    Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8