在javascript中替换字符串中的字符

时间:2017-01-13 05:28:52

标签: javascript regex html-entities

我正在尝试更换"悉尼&墨尔本"与&。 但它没有用。

我尝试了以下几种不同的方法:

  • 使用for循环和if语句:

    &
  • 使用正则表达式并替换:

    for(var i=0; i<str.length; i++){
        if(str[i]==="&"){
          str[i]="&amp;";
        }
    

我确实理解var myRegExp = /\b&\b/; str = str.replace(myRegExp,"&amp;"); return str; &是相同的事情,因此结果可能会出现在&amp;(实际上它正在我写作时发生这里堆栈溢出)。但它有办法吗?

2 个答案:

答案 0 :(得分:3)

您的第一次尝试

  

with for循环和if语句:

for(var i=0; i<str.length; i++){
    if(str[i]==="&"){
      str[i]="&amp;";
    }
}

当然这不起作用。 JS字符串是immutable,这意味着

  

创建字符串后,无法对其进行修改

它不会导致运行时错误,但它不会执行任何操作。 (即使JS字符串不是不可变的,它们也不能用多个字符替换一个字符。)

你的第二次尝试

  

使用正则表达式并替换:

var myRegExp = /\b&\b/;

str = str.replace(myRegExp,"&amp;");
return str;

当然这不起作用。空格和符号之间没有字边界。请参阅word boundary

的定义
  

单词边界匹配单词字符未被跟随或前面有另一个单词字符的位置。

其中“单词字符”等同于[a-zA-Z0-9_]

但为什么?

然而,真正的问题是你想要这样做的原因。如果您只想将此字符串作为文本插入DOM,请使用textContent

执行此操作
document.getElementById("city").textContent = "Sydney & Melbourne";

(而不是使用innerHTML)。在jQuery中,如果您正好使用它,请使用text()而不是html()。这种方法的优点是不会被字符串中的其他HTML字符混淆,特别是<

如果您的问题与网址中的&有关,则不应该是HTML转义 - 您应该对其进行URI编码,但您可能已经知道了。

如果您的问题是将此传递给需要正确编码的HTML字符串的服务器,那么您应该重新考虑您的API设计。通常,最好将原始字符串存储在服务器上,并在必要时解码/编码/转义/取消它们 - 请记住,服务器数据可能会显示在浏览器以外的上下文中。如果您确实想要正确地发送服务器HTML转义字符串,那么您需要担心的不仅仅是&,还需要担心其他特殊的HTML字符。为此,您应该使用您喜欢的库中可能提供的一些实用程序,或标准:

function htmlEscape(str) {
  var div = document.createElement('div');
  div.textContent = str;
  return div.innerHTML;
}

答案 1 :(得分:1)

目前,为了替换&,您需要将&括在单词字符之外(例如:a&b)。

这是一个JSFiddle,可以直观地解释我对您尝试使用的正则表达式的看法。

相反,只需直接定位&

var string = 'Sydney & Melbourne';

string = string.replace(/&/g, '&amp;');

console.log(string);