Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   str_replace как в php (https://javascript.ru/forum/jquery/79435-str_replace-kak-v-php.html)

Dark Souls 08.02.2020 17:50

str_replace как в php
 
Help граждане гуру.

String.prototype.str_replace_all ()
{
    if (Array.isArray(arguments[0])) {
        for (let i = 0; i < arguments[0].length; i++) {
            this.replace(new RegExp(arguments[0][i], "gi"),  Array.isArray(arguments[1]) ? arguments[1][i] : arguments[1]));
        }
    }
}

"one two three for five".str_replace_all(["two", "for"], "|");

А оно не работает. Что не так?

Aetae 08.02.2020 18:02

Вон вверху есть "Аналоги функций PHP", чтоб тебе не писать своих костылей, и в частности str_replace.

А конкретно у тебя не так - всё. Это даже не javascript, на неряшливый набор букв.

Синтаксис:
1.String.prototype.str_replace_all () { ... } - такой конструкции в javascript нет.
2.this.replace( ... )); - в конце лишняя скобка.

Логика:
1. Чтобы получить результат - функция должна возвращать результат. Отсутствует return.
2. Метод replace не меняет исходную строку. Нет сохранения результата.
3. Строки попадающие в new RegExp должны быть экранированы. Если там попадутся спецсимволы всё упадёт.
4. Нет проверки переданных аргуметов.

Стиль:
1. Использование arguments нежелательно, если нужно получить массив входных аргументов используйте ...args.
2. Для именования в javascript принят camelCase, snake_case не рекомендован.

Dark Souls 08.02.2020 18:21

Цитата:

Сообщение от Aetae (Сообщение 519801)
Вон вверху есть "Аналоги функций PHP", чтоб тебе не писать своих костылей, и в частности str_replace.

А конкретно у тебя не так - всё. Это даже не javascript, на неряшливый набор букв.

К сожалению верхний аналог мне не подходит.
Надо чтобы реплейсер работал через регулярку.
"двенадцать миллиардов триста четырнадцать миллионов четыреста шестьдесят семь"
- например в этой строке заменить название разрядов на запятые для разбития на массив. Регулярка нужна для удаления пробелов и вариаций окончаний разрядов.

Ну, покажите пример ряшливого кода. может поучусь. :thanks:

Dark Souls 08.02.2020 18:27

String.prototype.replace_all = function () {
	// let args = arguments;

	if (Array.isArray(arguments[0]))
	{
		for (let i in arguments[0]) {
			this.replace(new RegExp(arguments[0][i], "gi"), Array.isArray(arguments[1]) ? arguments[1][i] : arguments[1]);
		}
	}

	console.log(arguments);
	return this;
}


Изначально она выглядит так.

рони 08.02.2020 18:29

Dark Souls,
что на входе, что на выходе?

Dark Souls 08.02.2020 18:36

Цитата:

Сообщение от рони (Сообщение 519804)
Dark Souls,
что на входе, что на выходе?

на входе и два параметра, ([], []), ([], ""), ("", "") - массивы одномерные.
("", []) - такого варианта быть не может.

на выходе измененная строка.

рони 08.02.2020 18:38

Dark Souls,
если не будет служебных символов
String.prototype.str_replace_all = function(arRegexp, str) {
var expr = new RegExp(arRegexp.join("|"), "gi");
return this.replace(expr, str)
}
alert("one two three for five".str_replace_all(["two", "for"], "|"));

рони 08.02.2020 18:45

Dark Souls,
Цитата:

Сообщение от Aetae
Строки попадающие в new RegExp должны быть экранированы.

c экранированием
String.prototype.str_replace_all = function(arRegexp, str) {
function escapeRegExp(string){
  return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
var expr = new RegExp(arRegexp.map(escapeRegExp).join("|"), "gi");
return this.replace(expr, str)
}
alert("one two three for five".str_replace_all(["two", "for"], "|"));

Dark Souls 08.02.2020 19:38

Спасибо :thanks:


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