替换 javascript 中字符串中的字符
replacing characters in a string in javascript
我正在尝试将 "Sydney & Melbourne" 中的 &
替换为 &
。
但是没用。
我尝试了以下几种不同的方法:
使用 for 循环和 if 语句:
for(var i=0; i<str.length; i++){
if(str[i]==="&"){
str[i]="&";
}
用正则表达式替换:
var myRegExp = /\b&\b/;
str = str.replace(myRegExp,"&");
return str;
我确实知道 &
和 &
是相同的东西,所以结果可能是 &
(实际上它发生在我在这里写的时候堆栈溢出)。但是有办法解决吗?
目前,要替换 &
,您需要用单词字符包围 &
(例如:a&b
)。
这是一个 JSFiddle,直观地解释了我对您尝试使用的正则表达式的意思。
相反,直接定位 &
:
var string = 'Sydney & Melbourne';
string = string.replace(/&/g, '&');
console.log(string);
你的第一次尝试
with for loop and if statement:
for(var i=0; i<str.length; i++){
if(str[i]==="&"){
str[i]="&";
}
}
这当然不行。 JS字符串是immutable,也就是
Once a string is created, it is not possible to modify it
它不会导致 run-time 错误,但它不会执行任何操作。 (即使 JS 字符串不是不可变的,你也不能用多个字符替换一个字符。)
你的第二次尝试
with regex and replace:
var myRegExp = /\b&\b/;
str = str.replace(myRegExp,"&");
return str;
这当然不行。 space 和&符号之间没有单词边界。见word boundary的定义:
A word boundary matches the position where a word character is not followed or preceded by another word-character.
其中 "word character" 等同于 [a-zA-Z0-9_]
.
但是为什么呢?
然而,真正的问题是你为什么要这样做。如果您只想将此字符串作为文本插入到 DOM 中,请使用 textContent
:
document.getElementById("city").textContent = "Sydney & Melbourne";
(而不是使用 innerHTML
)。在 jQuery 中,如果您碰巧使用它,请使用 text()
而不是 html()
。这种方法的优点是不会被字符串中的其他 HTML 个字符混淆,特别是 <
.
如果您的问题与 URL 中的 &
有关,您不应该 HTML-escaping 它——您应该 URI-encoding 它,但您可能早就知道了。
如果您的问题是您将其传递给需要正确编码 HTML 字符串的服务器,那么您应该重新考虑您的 API 设计。一般来说,最好将原始字符串存储在服务器上,并在必要时 decode/encode/escape/unescape 它们——请记住,服务器数据可能会在浏览器以外的上下文中显示。如果你真的想正确地向服务器发送 HTML-escaped 字符串,那么你需要担心的不仅仅是 &
,还有其他特殊的 HTML 字符。为此,您应该使用您最喜欢的库或标准库中可能提供的一些实用程序:
function htmlEscape(str) {
var div = document.createElement('div');
div.textContent = str;
return div.innerHTML;
}
我正在尝试将 "Sydney & Melbourne" 中的 &
替换为 &
。
但是没用。
我尝试了以下几种不同的方法:
使用 for 循环和 if 语句:
for(var i=0; i<str.length; i++){ if(str[i]==="&"){ str[i]="&"; }
用正则表达式替换:
var myRegExp = /\b&\b/; str = str.replace(myRegExp,"&"); return str;
我确实知道 &
和 &
是相同的东西,所以结果可能是 &
(实际上它发生在我在这里写的时候堆栈溢出)。但是有办法解决吗?
目前,要替换 &
,您需要用单词字符包围 &
(例如:a&b
)。
这是一个 JSFiddle,直观地解释了我对您尝试使用的正则表达式的意思。
相反,直接定位 &
:
var string = 'Sydney & Melbourne';
string = string.replace(/&/g, '&');
console.log(string);
你的第一次尝试
with for loop and if statement:
for(var i=0; i<str.length; i++){
if(str[i]==="&"){
str[i]="&";
}
}
这当然不行。 JS字符串是immutable,也就是
Once a string is created, it is not possible to modify it
它不会导致 run-time 错误,但它不会执行任何操作。 (即使 JS 字符串不是不可变的,你也不能用多个字符替换一个字符。)
你的第二次尝试
with regex and replace:
var myRegExp = /\b&\b/;
str = str.replace(myRegExp,"&");
return str;
这当然不行。 space 和&符号之间没有单词边界。见word boundary的定义:
A word boundary matches the position where a word character is not followed or preceded by another word-character.
其中 "word character" 等同于 [a-zA-Z0-9_]
.
但是为什么呢?
然而,真正的问题是你为什么要这样做。如果您只想将此字符串作为文本插入到 DOM 中,请使用 textContent
:
document.getElementById("city").textContent = "Sydney & Melbourne";
(而不是使用 innerHTML
)。在 jQuery 中,如果您碰巧使用它,请使用 text()
而不是 html()
。这种方法的优点是不会被字符串中的其他 HTML 个字符混淆,特别是 <
.
如果您的问题与 URL 中的 &
有关,您不应该 HTML-escaping 它——您应该 URI-encoding 它,但您可能早就知道了。
如果您的问题是您将其传递给需要正确编码 HTML 字符串的服务器,那么您应该重新考虑您的 API 设计。一般来说,最好将原始字符串存储在服务器上,并在必要时 decode/encode/escape/unescape 它们——请记住,服务器数据可能会在浏览器以外的上下文中显示。如果你真的想正确地向服务器发送 HTML-escaped 字符串,那么你需要担心的不仅仅是 &
,还有其他特殊的 HTML 字符。为此,您应该使用您最喜欢的库或标准库中可能提供的一些实用程序:
function htmlEscape(str) {
var div = document.createElement('div');
div.textContent = str;
return div.innerHTML;
}