如何在JavaScript中执行str_replace,替换JavaScript中的文本?


137

我想使用str_replace或其类似替代方法来替换JavaScript中的某些文本。

var text = "this is some sample text that i want to replace";
var new_text = replace_in_javascript("want", "dont want", text);
document.write("new_text");

应该给

this is some sample text that i dont want to replace

如果要使用正则表达式,与内置替换方法相比,性能影响是什么?


3
奇怪的是,没有人注意到PHP str_replace也接受两个相同长度的数组,其中第一个数组中的每个字符串都替换为第二个数组中相同索引的字符串。请参阅stackoverflow.com/a/5069776/296430,了解到目前为止我发现的唯一正确的函数,该函数可以模仿javascript中的确切行为。
Jules Colle 2013年

2
@JulesColle这个答案经常失败-在这里查看原因/何时失败以及更好的解决方案:stackoverflow.com/a/37949642/445295
Stephen M. Harris

1
如果你想要高兼容性-包括怪癖-与PHP版本...看看github.com/kvz/locutus/blob/master/src/php/strings/...
道格·科伯恩

Answers:


12

使用正则表达式进行字符串替换比使用字符串替换慢得多。
正如在JSPerf上演示的那样,创建正则表达式可以具有不同的效率水平,但是它们都比简单的字符串替换要慢得多。正则表达式速度较慢,因为

固定字符串匹配没有回溯,编译步骤,范围,字符类或其他许多使正则表达式引擎变慢的功能。当然有优化正则表达式匹配的方法,但我认为在通常情况下不太可能击败索引到字符串中。

为了在JS perf页面上进行简单的测试,我记录了一些结果:

<script>
// Setup
  var startString = "xxxxxxxxxabcxxxxxxabcxx";
  var endStringRegEx = undefined;
  var endStringString = undefined;
  var endStringRegExNewStr = undefined;
  var endStringRegExNew = undefined;
  var endStringStoredRegEx = undefined;      
  var re = new RegExp("abc", "g");
</script>

<script>
// Tests
  endStringRegEx = startString.replace(/abc/g, "def") // Regex
  endStringString = startString.replace("abc", "def", "g") // String
  endStringRegExNewStr = startString.replace(new RegExp("abc", "g"), "def"); // New Regex String
  endStringRegExNew = startString.replace(new RegExp(/abc/g), "def"); // New Regexp
  endStringStoredRegEx = startString.replace(re, "def") // saved regex
</script>

Chrome 68的结果如下:

String replace:    9,936,093 operations/sec
Saved regex:       5,725,506 operations/sec
Regex:             5,529,504 operations/sec
New Regex String:  3,571,180 operations/sec
New Regex:         3,224,919 operations/sec

为了完整起见(从注释中借用),值得一提的是.replace仅替换匹配字符的第一个实例。只能用替换所有实例//g。如果替换多个实例,性能折衷和代码优雅可能会被认为name.replace(' ', '_').replace(' ', '_').replace(' ', '_');更糟while (name.includes(' ')) { name = name.replace(' ', '_') }


那很有趣,并且使纯字符串替换比正则表达式更有意义。可能值得一提(就像在某些答案中一样),它.replace仅替换匹配字符的第一个实例。只能用替换所有实例//g。如果替换多个实例,性能折衷可能会变得更糟name.replace(' ', '_').replace(' ', '_').replace(' ', '_');或更糟糕while (name.includes(' ')) { name = name.replace(' ', '_') }
Lex

201

您将使用以下replace方法:

text = text.replace('old', 'new');

很明显,第一个参数是您要寻找的东西。它也可以接受正则表达式。

请记住,它并不会改变原来的字符串。它仅返回新值。


4
非常感谢“它只会返回而不会改变”!那就是我一直在扯头发很长时间,直到我听到你的评论……
Aditya MP

70
string.replace('old','new')将仅替换字符串中“ old”的第一个实例。在realmag777的答案中使用带有'g'标志的正则表达式将替换字符串的所有实例。text = text.replace(/ old / g,'new')将替换所有'old'实例
WNRosenberg 2012年

1
不区分大小写怎么办?
Netorica

7
^ text.replace(/ old / gi,'new')将所有'old'实例替换为'new',不区分大小写(例如'OLD'和'oLd'也将被替换)
arnoudhgz


84

更简单地说:

city_name=city_name.replace(/ /gi,'_');

将所有空格替换为“ _”!


10
这是“ str_replace”功能(全局)的更准确的翻译。选择的答案将仅替换第一个实例。
rICh 2012年

1
别忘了转义字符,尤其是如果您要替换转义的十六进制转义字符:例如\ x27将是.replace(/\\x3B/g,';')
dmayo

18

所有这些方法都不会修改原始值,而是返回新的字符串。

var city_name = 'Some text with spaces';

用_ 替换第一个空格

city_name.replace(' ', '_'); // Returns: Some_text with spaces

使用正则表达式将所有空格替换为_。如果您需要使用正则表达式,那么我建议使用https://regex101.com/对其进行测试。

city_name.replace(/ /gi,'_');  // Returns: Some_text_with_spaces 

所有空格替换为_,而不使用regex。功能方式。

city_name.split(' ').join('_');  // Returns: Some_text_with_spaces

16

您应该这样写:

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want");
document.write(new_text);

14

其他人提供给您的代码只会替换一次,而使用正则表达式将全部替换(如@sorgit所说)。要用“不想要”替换所有“想要”,请使用以下代码:

var text = "this is some sample text that i want to replace";
var new_text = text.replace(/want/g, "dont want");
document.write(new_text);

变量“ new_text”将导致“这是一些我不想替换的示例文本”。

要获取有关正则表达式的快速指南,请访问:
http : //www.cheatography.com/davechild/cheat-sheets/regular-expressions/
要了解有关的更多信息str.replace(),请访问:
https : //developer.mozilla.org/ zh-CN / docs / JavaScript / Reference / Global_Objects / String / replace
祝您好运!



8

嗯。你检查replace()了吗?

您的代码将如下所示

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want");
document.write(new_text);

7
var new_text = text.replace("want", "dont want");

7

在JavaScript中,您replace在String对象上调用方法,例如"this is some sample text that i want to replace".replace("want", "dont want"),它将返回替换后的字符串。

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want"); // new_text now stores the replaced string, leaving the original untouched

7

JavaScript具有replace()String对象的方法来替换子字符串。此方法可以有两个参数。第一个参数可以是字符串或正则表达式模式(regExp对象),第二个参数可以是字符串或函数。replace()具有两个字符串参数的方法的示例如下所示。

var text = 'one, two, three, one, five, one';
var new_text = text.replace('one', 'ten');
console.log(new_text)  //ten, two, three, one, five, one

请注意,如果第一个参数是字符串,则如上例所示,仅替换第一次出现的子字符串。要替换所有出现的子字符串,您需要提供带有g(全局)标志的正则表达式。如果不提供全局标志,则即使您将正则表达式作为第一个参数,也只会替换子字符串的第一个匹配项。因此,让我们替换one上面示例中所有出现的情况。

var text = 'one, two, three, one, five, one';
var new_text = text.replace(/one/g, 'ten');
console.log(new_text)  //ten, two, three, ten, five, ten

请注意,不要将正则表达式模式用引号引起来,这会使它成为字符串而不是regExp对象。要进行不区分大小写的替换,您需要提供其他标志i,以使模式不区分大小写。在这种情况下,上述正则表达式将为/one/gi。注意i这里添加的标志。

如果第二个参数具有一个函数,并且存在匹配项,则该函数将与三个参数一起传递。函数获取的参数是匹配项,匹配项的位置和原始文本。您需要返回该匹配项应替换为的内容。例如,

var text = 'one, two, three, one, five, one';
var new_text = text.replace(/one/g, function(match, pos, text){
return 'ten';
});
console.log(new_text) //ten, two, three, ten, five, ten

您可以使用函数作为第二个参数来对替换文本进行更多控制。


2
您是唯一提及替换功能内部功能的人
Emeeus

4

您可以使用

text.replace('old', 'new')

并一次在一个字符串中更改多个值,例如将#更改为字符串v,将_更改为字符串w:

text.replace(/#|_/g,function(match) {return (match=="#")? v: w;});

3

如果您确实想要与PHP等效的str_replace东西,可以使用Locutus。PHP的str_replace支持版本比JavaScript String.prototype.replace支持的选项更多。例如标签:

//PHP
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");
//JS with Locutus
var $bodytag = str_replace(['{body}', 'black', '<body text='{body}'>')  

或数组的

//PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");
//JS with Locutus
var $vowels = ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"];
var $onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

同样,它不使用正则表达式,而是用于循环。如果您不想使用正则表达式,但是想要简单的字符串替换,则可以使用类似以下内容(基于Locutus)

function str_replace (search, replace, subject) {

  var i = 0
  var j = 0
  var temp = ''
  var repl = ''
  var sl = 0
  var fl = 0
  var f = [].concat(search)
  var r = [].concat(replace)
  var s = subject
  s = [].concat(s)

  for (i = 0, sl = s.length; i < sl; i++) {
    if (s[i] === '') {
      continue
    }
    for (j = 0, fl = f.length; j < fl; j++) {
      temp = s[i] + ''
      repl = r[0]
      s[i] = (temp).split(f[j]).join(repl)
      if (typeof countObj !== 'undefined') {
        countObj.value += ((temp.split(f[j])).length - 1)
      }
    }
  }
  return s[0]
}
var text = "this is some sample text that i want to replace";

var new_text = str_replace ("want", "dont want", text)
document.write(new_text)

有关更多信息,请参见源代码https://github.com/kvz/locutus/blob/master/src/php/strings/str_replace.js



2

您有以下选择:

  1. 替换第一次出现

var text = "this is some sample text that i want to replace and this i WANT to replace as well.";
var new_text = text.replace('want', 'dont want');
// new_text is "this is some sample text that i dont want to replace and this i WANT to replace as well"
console.log(new_text)

  1. 替换所有出现的事件-区分大小写

var text = "this is some sample text that i want to replace and this i WANT to replace as well.";
var new_text = text.replace(/want/g, 'dont want');
// new_text is "this is some sample text that i dont want to replace and this i WANT to replace as well
console.log(new_text)

  1. 替换所有出现的内容-不区分大小写

var text = "this is some sample text that i want to replace and this i WANT to replace as well.";
var new_text = text.replace(/want/gi, 'dont want');
// new_text is "this is some sample text that i dont want to replace and this i dont want to replace as well
console.log(new_text)

更多信息-> 这里


2

在Javascript中,可用replace函数将给定字符串中的子字符串替换为新字符串。 用:

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want");
console.log(new_text);

您甚至可以通过此函数使用正则表达式。例如,如果要替换所有出现的,.

var text = "123,123,123";
var new_text = text.replace(/,/g, ".");
console.log(new_text);

这里的g修饰符用于全局匹配所有可用的匹配。


2

replace substring in a sentence使用React的方法:

 const replace_in_javascript = (oldSubStr, newSubStr, sentence) => {
    let newStr = "";
    let i = 0;
    sentence.split(" ").forEach(obj => {
      if (obj.toUpperCase() === oldSubStr.toUpperCase()) {
        newStr = i === 0 ? newSubStr : newStr + " " + newSubStr;
        i = i + 1;
      } else {
        newStr = i === 0 ? obj : newStr + " " + obj;
        i = i + 1;
      }
    });
    return newStr;
  };

在这里运行方法


2

如果您不想使用正则表达式,则可以使用此函数来替换字符串中的所有内容

源代码:

function ReplaceAll(mystring, search_word, replace_with) 
{
    while (mystring.includes(search_word))
    {
        mystring = mystring.replace(search_word, replace_with);
    }

    return mystring;  
}

如何使用:

var mystring = ReplaceAll("Test Test", "Test", "Hello"); 

2

使用JS的String.prototype.replace第一个参数应为Regex模式或String,第二个参数应为String或函数。

str.replace(regexp|substr, newSubStr|function);

例如:

var str = 'this is some sample text that i want to replace'; var newstr = str.replace(/want/i, "dont't want"); document.write(newstr); // this is some sample text that i don't want to replace


0
function str_replace($old, $new, $text)
{
   return ($text+"").split($old).join($new); 
}

您不需要其他库。


-1

添加了一种replace_in_javascript可以满足您要求的方法。还发现您正在编写一个字符串"new_text"document.write()其中应该引用一个变量new_text

let replace_in_javascript= (replaceble, replaceTo, text) => {
  return text.replace(replaceble, replaceTo)
}

var text = "this is some sample text that i want to replace";
var new_text = replace_in_javascript("want", "dont want", text);
document.write(new_text);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.