我正在使用javascript,我创建了一个jsfiddle。
我有两个文本字段:一个包含用户输入,另一个包含结果。我的问题是,当我输入两次相同的单词时,只有其中一个被替换。
例如,如果我在第一个文本字段中输入"going,going"
,则结果为"GNG,going"
- 而不是"GNG,GNG"
。我的代码中我做错了什么?
HTML:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Scrolling DIV demo on iPhone / iPod Touch / Android / iPad</title>
</head>
<body>
<input type="text" id="first_text" value="going, used to, to do fast, as soon as possible"/>
<input type="text" id="second_text"/>
<input type="button" onclick="replaceText()" value="Click!"/>
</body>
</html>
使用Javascript:
var replaceText = function () {
var inputval = document.getElementById('first_text').value;
var arr = {
"going": "GNG",
"used to": "UD",
"as soon as possible": "ASAP",
"to do fast": "tdf"
}
for(var key in arr) {
if (typeof (arr[key]) !== "undefined") inputval = inputval.replace(key, arr[key])
}
document.getElementById("second_text").value = inputval;
}
答案 0 :(得分:5)
使用inputval.replace(RegExp(key,"g"), arr[key])
换句话说,从您key
值创建正则表达式,将'g [lobal]'modifier添加到其中。
答案 1 :(得分:3)
变化:
inputval = inputval.replace(key, arr[key])
要:
inputval = inputval.replace(new RegExp(key, 'g'), arr[key])
默认情况下,replace
函数和正则表达式不是全局的,而是g
开关的作用。这里的工作示例:http://jsfiddle.net/NSy8P/1/
答案 2 :(得分:1)
那是因为替换只是对第一次出现的操作而不是你可以使用以下内容:
function replaceAll(txt, replace, with_this) {
return txt.replace(new RegExp(replace, 'g'),with_this);
}
http://naspinski.net/post/Javascript-replaceAll-function.aspx
答案 3 :(得分:1)
替换仅替换模式的第一次出现。如果您想要更换更多,那么一旦您需要使用代码的正则表达式版本。 (注意“g”代表“全球替代”)
'going, going'.replace(/going/g, 'Go'); // 'Go, Go'
如果您仍想保留相同的代码(而不是将其重写为直接使用正则表达式模式),您可以从字符串中动态创建正则表达式。
var pattern = new RegExp('going', 'g');
但是你的模式中不能有regexp特殊字符。如果您希望能够在键中使用特殊字符(如括号或反斜杠),则需要一个转义函数,如下所示:
function regex_escape(str){
return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1');
}
var pattern = new RegExp (regex_escape(key), 'g');