Как заменить весь контент внутри div? [Дубликат]

Вы можете использовать Reflection для этого: (из моей библиотеки - это получает имена и значения)

public static Dictionary DictionaryFromType(object atype)
{
    if (atype == null) return new Dictionary();
    Type t = atype.GetType();
    PropertyInfo[] props = t.GetProperties();
    Dictionary dict = new Dictionary();
    foreach (PropertyInfo prp in props)
    {
        object value = prp.GetValue(atype, new object[]{});
        dict.Add(prp.Name, value);
    }
    return dict;
}

Эта вещь не будет работать для свойств с индексом - для этого (она становится громоздкой ):

public static Dictionary DictionaryFromType(object atype, 
     Dictionary indexers)
{
    /* replace GetValue() call above with: */
    object value = prp.GetValue(atype, ((indexers.ContainsKey(prp.Name)?indexers[prp.Name]:new string[]{});
}

Кроме того, чтобы получить только общедоступные свойства: ( см. MSDN в BindingFlags enum )

/* replace */
PropertyInfo[] props = t.GetProperties();
/* with */
PropertyInfo[] props = t.GetProperties(BindingFlags.Public)

Это работает с анонимными типами, слишком! Чтобы просто получить имена:

public static string[] PropertiesFromType(object atype)
{
    if (atype == null) return new string[] {};
    Type t = atype.GetType();
    PropertyInfo[] props = t.GetProperties();
    List propNames = new List();
    foreach (PropertyInfo prp in props)
    {
        propNames.Add(prp.Name);
    }
    return propNames.ToArray();
}

И это примерно то же самое только для значений, или вы можете использовать:

GetDictionaryFromType().Keys
// or
GetDictionaryFromType().Values

Но это немного медленнее, я бы представьте себе.

3187
задан Lamy 23 May 2018 в 12:12
поделиться

28 ответов

Мне нравится этот метод (он выглядит немного чище):

text = text.replace(new RegExp("cat","g"), "dog"); 
1646
ответ дан Peter Mortensen 16 August 2018 в 10:19
поделиться
  • 1
    Хорошо, как вам избежать строки, чтобы использовать ее в качестве шаблона регулярных выражений? – rakslice 19 June 2013 в 22:16
  • 2
    В Android 4.1 метод regexp на 15% быстрее, но вы не избегаете выражения для поиска, поэтому этот тест неполный. – andreszs 19 January 2015 в 01:01
  • 3
    Существует проблема с этим решением, если в строке поиска содержатся специальные символы выражения regexp, они будут интерпретироваться. Я рекомендую ответить @Sandy Unitedwolf. – Thomas Leduc 17 February 2016 в 17:09
  • 4
    Первый сделает это: 'bla.bla'.replaceAll ('. ',' _ '); & Quot; _______ & Quot ;. Второй будет делать «bla_bla», что, в общем, то, что вы хотите сделать. – RobKohr 21 February 2016 в 02:12
  • 5
    Глянцевый ответ. Перейдите к следующему, «неправильному» ответу с отметкой в ​​5 раз больше голосов. Это то, что ты хочешь. – HoldOffHunger 30 August 2016 в 00:58
  • 6
    Простой, легкий и, вероятно, самый эффективный вариант: хороший ответ. – machineghost 25 October 2016 в 23:51
  • 7
    Я не знаю, работает ли это, но ... это работает. – Emilio Grisolía 13 January 2017 в 19:18
  • 8
    На самом деле, хотя я не оценил его лично, split / join обычно является очень эффективным решением. – machineghost 13 January 2017 в 19:30
  • 9
    – mattnificent 15 March 2018 в 08:47
  • 10
    он даже в хроме, на 100% быстрее на firefox и на 50% медленнее на IE ...: jsperf.com/replace-regex-split-join – Olivier 22 May 2018 в 14:39

Используйте регулярное выражение:

str.replace(/abc/g, '');
1646
ответ дан Peter Mortensen 16 August 2018 в 10:19
поделиться
  • 1
    В Android 4.1 метод regexp на 15% быстрее, но вы не избегаете выражения для поиска, поэтому этот тест неполный. – andreszs 19 January 2015 в 01:01
  • 2
    Существует проблема с этим решением, если в строке поиска содержатся специальные символы выражения regexp, они будут интерпретироваться. Я рекомендую ответить @Sandy Unitedwolf. – Thomas Leduc 17 February 2016 в 17:09
  • 3
    Первый сделает это: 'bla.bla'.replaceAll ('. ',' _ '); & Quot; _______ & Quot ;. Второй будет делать «bla_bla», что, в общем, то, что вы хотите сделать. – RobKohr 21 February 2016 в 02:12
  • 4
    Глянцевый ответ. Перейдите к следующему, «неправильному» ответу с отметкой в ​​5 раз больше голосов. Это то, что ты хочешь. – HoldOffHunger 30 August 2016 в 00:58
  • 5
    Простой, легкий и, вероятно, самый эффективный вариант: хороший ответ. – machineghost 25 October 2016 в 23:51
  • 6
    Я не знаю, работает ли это, но ... это работает. – Emilio Grisolía 13 January 2017 в 19:18
  • 7
    На самом деле, хотя я не оценил его лично, split / join обычно является очень эффективным решением. – machineghost 13 January 2017 в 19:30
  • 8
    @ThomasLeduc похоже, что проблема, о которой вы говорили, может быть обработана с помощью lodash = & gt; lodash.com/docs/4.17.5#escapeRegExp – mattnificent 15 March 2018 в 08:47
  • 9
    он даже в хроме, на 100% быстрее на firefox и на 50% медленнее на IE ...: jsperf.com/replace-regex-split-join – Olivier 22 May 2018 в 14:39

Если строка содержит аналогичный шаблон, подобный abccc, вы можете использовать это:

str.replace(/abc(\s|$)/g, "")
10
ответ дан 3 revs, 2 users 78% 16 August 2018 в 10:19
поделиться

Использование RegExp в JavaScript может выполнить эту работу для вас, просто выполните следующее:

var str ="Test abc test test abc test test test abc test test abc";
str = str.replace(/abc/g, '');

Если вы думаете о повторном использовании, создайте функцию, которая сделает это за вас, но это не рекомендуется, так как это только одна функция линии, но если вы сильно ее используете, вы можете написать что-то вроде этого:

String.prototype.replaceAll = String.prototype.replaceAll || function(string, replaced) {
  return this.replace(new RegExp(string, 'g'), replaced);
};

и просто использовать его в своем коде снова и снова, как показано ниже:

var str ="Test abc test test abc test test test abc test test abc";
str = str.replaceAll('abc', '');

Но, как я упоминал ранее, это не будет иметь большого значения в отношении строк, которые должны быть записаны или производительности, только кеширование функции может привести к более быстрой работе на длинных строках, а также хорошей практике кода DRY, если вы хотите повторно использовать.

8
ответ дан Alireza 16 August 2018 в 10:19
поделиться
var string  = 'Test abc Test abc Test abc Test abc'
string = string.replace(/abc/g, '')
console.log(string)
9
ответ дан Ashutosh Narang 16 August 2018 в 10:19
поделиться

Это самая быстрая версия, в которой не использует регулярные выражения .

Пересмотренный jsperf

replaceAll = function(string, omit, place, prevstring) {
  if (prevstring && string === prevstring)
    return string;
  prevstring = string.replace(omit, place);
  return replaceAll(prevstring, omit, place, string)
}

It почти в два раза быстрее, чем метод split и join.

Как указано в комментарии здесь, это не будет работать, если ваша переменная omit содержит place, как в: replaceAll("string", "s", "ss"), потому что он всегда сможет заменить другое вхождение слова.

Существует еще один jsperf с вариантами на моей рекурсивной замене, которые идут еще быстрее ( http://jsperf.com/replace-all- vs-split-join / 12 )!

  • Обновление 27 июля 2017 года. Похоже, что RegExp теперь имеет самую высокую производительность в недавно выпущенном Chrome 59.
20
ответ дан Cole Lawrence 16 August 2018 в 10:19
поделиться
  • 1
    Мне понравилось ваше решение ... Хотел бы я дать вам +10, но вот мой +1. Я думаю, вы можете сохранить индекс подстроки, который был заменен, и перейти к следующему, если совпадение найдено с более низким индексом, чтобы избежать этой проблемы с бесконечным циклом. Я не могу комментировать производительность, потому что я не тестировал ее, но это всего лишь мои 2 цента на этом превосходном уровне. – Fr0zenFyr 10 July 2014 в 05:40
  • 2
    @ fr0zenfyr, если вы хотите проверить, нет ли опускания (чтобы предотвратить бесконечный цикл), вы можете сделать условное выражение, например if(place.replace(omit) === omit) { Нет совпадения, поэтому безопасно использовать цикл замещения } else { Сопоставьте так, чтобы использовать другой метод, например split и join } – Cole Lawrence 10 July 2014 в 13:41
  • 3
    Хм .. но в чем смысл объединения двух решений? В любом случае, я не поклонник подхода split / join. Спасибо за совет. – Fr0zenFyr 11 July 2014 в 05:14
  • 4
    – Cole Lawrence 11 July 2014 в 14:13
  • 5
    Проблемные ............ – momo 7 July 2017 в 09:52
str = str.replace(/abc/g, '');

Или попробуйте функцию replaceAll отсюда:

Какие полезные методы JavaScript расширяют встроенные объекты?

str = str.replaceAll('abc', ''); OR

var search = 'abc';
str = str.replaceAll(search, '');

EDIT: Разъяснение о замене доступности All

Метод replaceAll добавлен к прототипу String. Это означает, что он будет доступен для всех строковых объектов / литералов.

Например,

var output = "test this".replaceAll('this', 'that');  //output is 'test that'.
output = output.replaceAll('that', 'this'); //output is 'test this'
75
ответ дан Community 16 August 2018 в 10:19
поделиться
  • 1
    Можете ли вы переписать функцию replaceAll () там для тех, кто не использует прототип? – Click Upvote 17 July 2009 в 18:57
  • 2
    @Click Upvote .... вы используете прототип, это часть всех объектов JS. Я думаю, вы думаете о prototype.js библиотеке JS. – seth 17 July 2009 в 19:20
  • 3
    сет, небольшая коррекция. Если вы добавите метод прототипу, он доступен для всех объектов этого типа. Метод replceAll был добавлен в прототип String, и он должен работать для всех строковых объектов. – SolutionYogi 17 July 2009 в 19:23
  • 4
    @solutionyogi - Да, я раньше использовал прототип (правильно). Я просто обращался к комментарию OP о «не используя прототип». который я предполагал означать Prototype.js (возможно, неправильно?). Я должен был сказать «прототип», поскольку я пытался сказать, что объекты JavaScript имеют прототип. Таким образом, ОП уже «использовал прототип», хотя и в «косвенном» путь. Косвенным может быть неправильный термин для использования здесь, но я устал, поэтому mea culpa. – seth 18 July 2009 в 00:41
  • 5
    Я думаю, что дополнительная интересная часть должна быть размещена внизу. ps .: Я заметил, что только половина первой линии выходит за пределы области, позвольте мне это исправить! – user 4 July 2013 в 17:31
str = str.replace(new RegExp("abc", 'g'), "");

работал лучше для меня, чем приведенные выше ответы. поэтому new RegExp("abc", 'g') создает RegExp, что соответствует всему присутствию (флаг 'g') текста ("abc"). Вторая часть - это то, что заменяется на, в вашем случае пустую строку (""). str - это строка, и мы должны ее переопределить, так как replace(...) просто возвращает результат, но не переопределяет. В некоторых случаях вы можете использовать это.

18
ответ дан csomakk 16 August 2018 в 10:19
поделиться
  • 1
    Хотя этот фрагмент кода может быть решением, , включая объяснение , действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – yivi 28 December 2017 в 16:46
  • 2
    Да, ты прав. добавлено. также отредактировал его, чтобы ответить на исходный вопрос :) – csomakk 29 December 2017 в 18:54
  • 3
    Примечание: флаг g в regex означает, что это глобальный флаг, который будет соответствовать всем вхождениям – firstpostcommenter 2 July 2018 в 16:15

Хотя люди упомянули использование регулярных выражений, но есть лучший подход, если вы хотите заменить текст независимо от случая текста. Как прописные или строчные буквы. Используйте синтаксис ниже

//Consider below example
originalString.replace(/stringToBeReplaced/gi, '');

//Output will be all the occurrences removed irrespective of casing.

Здесь вы можете найти подробный пример здесь .

6
ответ дан evandrix 16 August 2018 в 10:19
поделиться
  • 1
    из примера сайта: «/ toBeReplacedString / gi - это регулярное выражение, которое вам нужно использовать. Здесь g представляет для глобального соответствия, а i представляет регистр без учета регистра. По умолчанию regex чувствителен к регистру & quot; – alikuli 3 August 2016 в 10:15

// зацикливать его до появления числа в 0. ИЛИ просто скопировать / вставить

    function replaceAll(find, replace, str) 
    {
      while( str.indexOf(find) > -1)
      {
        str = str.replace(find, replace);
      }
      return str;
    }
22
ответ дан Gonzalo Larralde 16 August 2018 в 10:19
поделиться
  • 1
    Этот метод опасен, не используйте его. Если строка замены содержит ключевое слово поиска, то произойдет бесконечный цикл. По крайней мере, сохраните результат .indexOf в переменной и используйте эту переменную в качестве второго параметра .indexOf (минус длина ключевого слова, плюс длина строки замены). – Rob W 29 October 2013 в 13:33
  • 2
    Я думаю о первой замене шаблона поиска с помощью внятого символа юникода, из которого мы уверены, что он не используется во входной строке. Как U + E000 в частной зоне. И затем замените его на цель. Я построил это здесь. . Я не уверен, что это хорошая идея. – Lux 2 July 2014 в 14:42

Вот функция прототипа строки, основанная на принятом ответе:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find, 'g'), replace);
};

EDIT

Если ваш find будет содержать специальные символы, вам необходимо их избежать:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
};

Fiddle: http://jsfiddle.net/cdbzL/

91
ответ дан jesal 16 August 2018 в 10:19
поделиться
  • 1
    Но что, если find содержит символы типа . или $, которые имеют специальные значения в регулярном выражении? – callum 7 October 2013 в 12:30
  • 2
    @callum В этом случае вам придется избегать вашей переменной find (см. править выше). – jesal 7 October 2013 в 17:41
  • 3
  • 4
    jesal, это замечательное решение проблемы замены строк, с которой я столкнулся, и, по-видимому, преодолевает «неизменность». строк в JavaScript. Могли бы вы или кто-то еще объяснить, как эта функция прототипа переопределяет неизменность строк? Это работает ; Я просто хочу понять этот вспомогательный вопрос, который он задает. – Tom 12 January 2016 в 01:08
  • 5
    @Tom: он не выполняет вообще неспособность: var str = this создает вторую ссылку на неизменяемую строку, к которой применяется метод replace, который, в свою очередь, возвращает новая неизменяемая строка . эти прототипы возвращают новую неизменяемую строку, если нет, вы могли бы записать someStrVar.replaceAll('o', '0'); и someStrVar. Вместо этого вам нужно написать someStrVar = someStrVar.replaceAll('o', '0'); & lt; - reassign, чтобы установить var для хранения новой неизменяемой строки . это не так. Попробуйте в консоли: x = 'foobar'; x.replaceAll('o', '0'); x; – Elias Van Ootegem 15 June 2016 в 16:26

Примечание: не используйте это в реальном коде.

. В качестве альтернативы регулярным выражениям для простой литеральной строки вы можете использовать

str = "Test abc test test abc test...".split("abc").join("");

. Общий шаблон

str.split(search).join(replacement)

В некоторых случаях это было быстрее, чем при использовании replaceAll и регулярного выражения, но в современных браузерах это, похоже, не так. Таким образом, это действительно должно быть использовано только как быстрый хак, чтобы избежать необходимости избегать регулярного выражения, а не реального кода.

1193
ответ дан Matthew Crumley 16 August 2018 в 10:19
поделиться
  • 1
    Это меня удивило, так как я ожидаю, что этот метод будет выделять больше объектов, создавая больше мусора и, следовательно, занимать больше времени, но когда я действительно тестировал в браузере, этот метод был последовательно примерно на 20% быстрее, чем принятый ответ. Разумеется, результаты могут различаться. – MgSam 20 September 2013 в 21:22
  • 2
    Мне было любопытно, и я установил это: jsperf.com/replace-all-vs-split-join . Кажется, что v8 просто безумно быстро расщепляется / присоединяется к массивам по сравнению с другими механизмами javascript. – fabi 23 November 2013 в 23:02
  • 3
    Очень приятно - также избавляет вас от возможности плохого RegExps при передаче специальными символами. Я добавляю общий флаг для «найти это и заменить его». в объекте, но был обеспокоен, если мне нужно было заменить "." или "}" и забыл, что я использовал RegEx через 3 месяца! – tobriand 3 April 2014 в 09:01
  • 4
    На моем ipad2 / safari split / join на 65% медленнее, чем замена, поэтому ваши результаты могут отличаться. – mrk 30 May 2014 в 04:30
  • 5
str = str.replace(/abc/g, '');

В ответ на комментарий:

var find = 'abc';
var re = new RegExp(find, 'g');

str = str.replace(re, '');

В ответ на комментарий Click Upvote вы можете упростить его еще больше:

function replaceAll(str, find, replace) {
    return str.replace(new RegExp(find, 'g'), replace);
}

Примечание. Регулярные выражения содержат специальные (мета) символы и, как таковые, опасно слепо передавать аргумент в функции find выше, не предварительно обработав его, чтобы избежать этих символов. Это описано в Справочнике JavaScript Mozilla Developer Network по регулярным выражениям , где они представляют следующую функцию полезности:

function escapeRegExp(str) {
    return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}

Итак, в чтобы сделать функцию replaceAll() выше безопасной, ее можно было бы изменить следующим образом, если вы также включили escapeRegExp:

function replaceAll(str, find, replace) {
    return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}
3609
ответ дан MC Emperor 16 August 2018 в 10:19
поделиться

Если то, что вы хотите найти, уже находится в строке, и у вас нет регулярного выражения escaper, вы можете использовать join / split:

    function replaceMulti(haystack, needle, replacement)
    {
        return haystack.split(needle).join(replacement);
    }

    someString = 'the cat looks like a cat';
    console.log(replaceMulti(someString, 'cat', 'dog'));

10
ответ дан Pitu 16 August 2018 в 10:19
поделиться
var str = "ff ff f f a de def";
str = str.replace(/f/g,'');
alert(str);

http://jsfiddle.net/ANHR9/

12
ответ дан pkdkk 16 August 2018 в 10:19
поделиться
  • 1
    в чем смысл скрипки, которая содержит только один и тот же javascript – JGallardo 8 February 2017 в 01:42

Использование регулярного выражения с флагом g заменит все:

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

См. также

512
ответ дан R3tep 16 August 2018 в 10:19
поделиться
  • 1
    Как мне кажется, глупо, но глобальное регулярное выражение JS - единственный способ сделать несколько заметок. – Mike 7 May 2009 в 03:43
  • 2

Если вы пытаетесь убедиться, что строка, которую вы ищете, не будет существовать даже после замены, вам нужно использовать цикл.

Например:

var str = 'test aabcbc';
str = str.replace(/abc/g, '');

Когда вы закончите, вы все равно будете иметь «test abc»!

. Простейшим циклом для этого было бы:

var str = 'test aabcbc';
while (str != str.replace(/abc/g, '')){
   str.replace(/abc/g, '');
}

Но это выполняет замену дважды для каждого цикла. Возможно (рискуя проголосовать), которые могут быть объединены для немного более эффективной, но менее читаемой формы:

var str = 'test aabcbc';
while (str != (str = str.replace(/abc/g, ''))){}
// alert(str); alerts 'test '!

Это может быть особенно полезно при поиске повторяющихся строк. Например, если у нас есть «a ,,, b», и мы хотим удалить все повторяющиеся запятые. [В этом случае можно было бы сделать .replace (/, + / g, ','), но в какой-то момент регулярное выражение становится сложным и достаточно медленным, чтобы зацикливаться.]

9
ответ дан SamGoody 16 August 2018 в 10:19
поделиться

Следующая функция работает для меня:

String.prototype.replaceAllOccurence = function(str1, str2, ignore) 
{
    return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
} ;

теперь вызывает следующие функции:

"you could be a Project Manager someday, if you work like this.".replaceAllOccurence ("you", "I");

Просто скопируйте и вставьте этот код в консоль вашего браузера в TEST.

6
ответ дан Sandeep Gantait 16 August 2018 в 10:19
поделиться

Соответствие глобальному регулярному выражению:

anotherString = someString.replace(/cat/g, 'dog');
47
ответ дан scronide 16 August 2018 в 10:19
поделиться

Я использую p для сохранения результата из предыдущей замены рекурсии:

function replaceAll(s, m, r, p) {
    return s === p || r.contains(m) ? s : replaceAll(s.replace(m, r), m, r, s);
}

Он заменит все вхождения в строке s до тех пор, пока это не будет возможно:

replaceAll('abbbbb', 'ab', 'a') → 'abbbb' → 'abbb' → 'abb' → 'ab' → 'a'

Чтобы избежать бесконечного цикла, я проверяю, содержит ли замена r совпадение m:

replaceAll('abbbbb', 'a', 'ab') → 'abbbbb'
25
ответ дан Termininja 16 August 2018 в 10:19
поделиться
  • 1
    Как я могу изменить вторую строку для замены строк? Это не работает: text = text.replace ('hey', 'hello'); Есть идеи? – Stefan Đorđević 9 December 2016 в 23:37
  • 2
    Конечно, Стефан, вот код ... text = text.replace (/ hey / g, 'hello'); – Chris OnDaRocks 12 December 2016 в 14:56
function replaceAll(str, find, replace) {
  var i = str.indexOf(find);
  if (i > -1){
    str = str.replace(find, replace); 
    i = i + replace.length;
    var st2 = str.substring(i);
    if(st2.indexOf(find) > -1){
      str = str.substring(0,i) + replaceAll(st2, find, replace);
    }       
  }
  return str;
}
15
ответ дан Tim Rivoli 16 August 2018 в 10:19
поделиться

Вы можете просто использовать ниже метод

/**
 * Replace all the occerencess of $find by $replace in $originalString
 * @param  {originalString} input - Raw string.
 * @param  {find} input - Target key word or regex that need to be replaced.
 * @param  {replace} input - Replacement key word
 * @return {String}       Output string
 */
function replaceAll(originalString, find, replace) {
  return originalString.replace(new RegExp(find, 'g'), replace);
};
7
ответ дан tk_ 16 August 2018 в 10:19
поделиться

Просто добавьте /g

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

в

// Replace 'hello' string with /hello/g regular expression.
document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');

/g означает глобальный

6
ответ дан Valentin 16 August 2018 в 10:19
поделиться

Вы можете попробовать объединить эти два мощных метода.

"test abc test test abc".split("abc").join("")

Надеюсь, что это поможет!

7
ответ дан Victor 16 August 2018 в 10:19
поделиться

Моя реализация, очень понятная

function replaceAll(string, token, newtoken) {
    if(token!=newtoken)
    while(string.indexOf(token) > -1) {
        string = string.replace(token, newtoken);
    }
    return string;
}
4
ответ дан Vitim.us 16 August 2018 в 10:19
поделиться
  • 1
    Это неверно. replaceAll("123434", "1234", "12") должен возвращать "1234", но вместо этого возвращает "12". – Bryan 16 April 2013 в 14:58
  • 2
    это зависит, если вы разрешите заменять «рекурсивно». или нет. – Vitim.us 16 April 2013 в 17:16
  • 3
    replaceAll ("abc", "a", "ab") никогда не заканчивается – user1002973 16 May 2013 в 15:44
while (str.indexOf('abc') !== -1)
{
    str = str.replace('abc', '');
}
11
ответ дан zdennis 16 August 2018 в 10:19
поделиться
  • 1
    Зачем ходить, когда мы можем ползать! – Alex K. 29 April 2014 в 11:45
  • 2
    @AlexK. Что не так с этим? Я думал, что это было очень приятно – duxfox-- 14 March 2015 в 02:54

Обновление:

Немного поздно для обновления, но поскольку я просто наткнулся на этот вопрос и заметил, что мой предыдущий ответ не тот, которым я доволен. Поскольку вопрос заключался в замене одного слова, невероятно, что никто не думал об использовании границ слов (\b)

'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"

Это простое регулярное выражение, которое позволяет избежать замены частей слов в большинстве случаев. Однако тире - по-прежнему считается границей слова. Таким образом, условные выражения могут использоваться в этом случае, чтобы избежать замены строк, таких как cool-cat:

'a cat is not a cool-cat'.replace(/\bcat\b/gi,'dog');//wrong
//"a dog is not a cool-dog" -- nips
'a cat is not a cool-cat'.replace(/(?:\b([^-]))cat(?:\b([^-]))/gi,'$1dog$2');
//"a dog is not a cool-cat"

в основном, этот вопрос такой же, как и здесь: Javascript replace & quot; '& quot; с " '' & quot;

@Mike, проверьте ответ, который я дал там ... regexp - это не единственный способ заменить несколько вхождений подстроки, далеко от нее. Подумайте об гибкости, подумайте о раздельности!

var newText = "the cat looks like a cat".split('cat').join('dog');

В качестве альтернативы, чтобы предотвратить замену частей слова, которые также будут приняты утвердительный ответ! Вы можете обойти эту проблему, используя регулярные выражения, которые, я признаю, несколько более сложны и, как результат, еще медленнее:

var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");

Выход такой же, как и принятый ответ , однако, используя выражение / cat / g в этой строке:

var oops = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/cat/g,'dog');
//returns "the dog looks like a dog, not a dogerpillar or cooldog" ?? 

На самом деле, это, вероятно, не то, что вы хотите. Что же тогда? IMHO, регулярное выражение, которое заменяет «cat» условно. (т. е. не является частью слова), например:

var caterpillar = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
//return "the dog looks like a dog, not a caterpillar or coolcat"

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

http://www.javascriptkit.com/jsref/regexp.shtml

http://www.regular-expressions.info


Окончательное дополнение:

Учитывая, что этот вопрос по-прежнему получает много просмотров, Я думал, что могу добавить пример .replace, используемый с функцией обратного вызова. В этом случае он значительно упрощает выражение и обеспечивает еще большую гибкость, например, замену правильной капитализацией или замену как cat, так и cats за один раз:

'Two cats are not 1 Cat! They\'re just cool-cats, you caterpillar'
   .replace(/(^|.\b)(cat)(s?\b.|$)/gi,function(all,char1,cat,char2)
    {
       //check 1st, capitalize if required
       var replacement = (cat.charAt(0) === 'C' ? 'D' : 'd') + 'og';
       if (char1 === ' ' && char2 === 's')
       {//replace plurals, too
           cat = replacement + 's';
       }
       else
       {//do not replace if dashes are matched
           cat = char1 === '-' || char2 === '-' ? cat : replacement;
       }
       return char1 + cat + char2;//return replacement string
    });
//returns:
//Two dogs are not 1 Dog! They're just cool-cats, you caterpillar
75
ответ дан Community 16 August 2018 в 10:19
поделиться
  • 1
    Я думаю, что дополнительная интересная часть должна быть размещена внизу. ps .: Я заметил, что только половина первой линии выходит за пределы области, позвольте мне это исправить! – user 4 July 2013 в 17:31

Замена одинарных кавычек:

function JavaScriptEncode(text){
    text = text.replace(/'/g,'&apos;')
    // More encode here if required

    return text;
}
25
ответ дан Termininja 16 August 2018 в 10:19
поделиться
  • 1
    Как я могу изменить вторую строку для замены строк? Это не работает: text = text.replace ('hey', 'hello'); Есть идеи? – Stefan Đorđević 9 December 2016 в 23:37
  • 2
    Конечно, Стефан, вот код ... text = text.replace (/ hey / g, 'hello'); – Chris OnDaRocks 12 December 2016 в 14:56
Другие вопросы по тегам:

Похожие вопросы: