用javascript替换字符串中的多个字符

问题描述:

我得到了这个不错的代码,我不知道为什么不起作用。为了兼容性的目的,它应该获得文本输入的值并用它的HTML代码替换每个给定的国家字符。但是,当我点击按钮时,该函数返回的字符串没有任何更改。 有什么想法?用javascript替换字符串中的多个字符

jsfiddle

<a id="reminder1" onclick="document.getElementById('reminder2').style.display = ''; document.getElementById('reminder1').style.display = 'none';"> 
    Set reminder 
</a> 
<a id="reminder2" class="reminder" style="display:none;"> 
    <input type="text" id="reminderh" size=40 style="font-size:20px;"> 
    <input type="button" value="Set" onclick="csere(document.getElementById('reminderh').value);"> 
</a> 

<script> 
function csere(qwe){ 
document.getElementById('reminder2').style.display = 'none'; 

var rtz0 = qwe.replace("á","&aacute;"); 
var rtz1 = rtz0.replace("Á","&Aacute;"); 

var rtz2 = rtz1.replace("é","&eacute;"); 
var rtz3 = rtz2.replace("É","&Eacute;"); 

var rtz4 = rtz3.replace("í","&iacute;"); 
var rtz5 = rtz4.replace("Í","&Iacute;"); 

var rtz6 = rtz5.replace("ö","&ouml;"); 
var rtz7 = rtz6.replace("Ö","&Ouml;"); 
var rtz8 = rtz7.replace("ő","&&#337;"); 
var rtz9 = rtz8.replace("Ő","&#336;"); 
var rtz10 = rtz9.replace("ó","&oacute;"); 
var rtz11 = rtz10.replace("Ó","&Oacute;"); 

var rtz12 = rtz11.replace("ü","&uuml;"); 
var rtz13 = rtz12.replace("Ü","&Uuml;"); 
var rtz14 = rtz13.replace("ű","&#369;"); 
var rtz15 = rtz14.replace("Ű","&#368;"); 
var rtz16 = rtz15.replace("ú","&uacute;"); 
var uio = rtz16.replace("Ú","&Uacute;"); 

//Creates a cookie with the final value (different function) 
createCookie('reminder',uio,1500); 

document.getElementById('reminder1').style.display = ''; 
} 
</script> 
+0

适用于我(我使用过'console.log') – SomeKittens 2012-08-02 17:16:08

+0

在完成所有替换之后,您永远不会将值分配回元素。 – jbabey 2012-08-02 17:29:00

+0

原来我实际上并不需要UTF编码。我只是在使用它,因为整个网站都使用它,而我认为它是必要的。基本上,我不需要代码来代替国家字符,因为即使没有它,它们看起来也很好。 – SeinopSys 2012-08-02 18:32:07

你可以replace一切程序,不使用命名实体:

return input.replace(/[^ -~]/g, function(chr) { 
//     ^^^^^^ 
// this is a regexp for "everything than printable ASCII-characters" 
// and even works in a ASCII-only charset. Identic: [^\u0020-\u007E] 
    return "&#"+chr.charCodeAt(0)+";"; 
}); 

如果你想使用命名的实体,您可以用键 - 值映射结合本(像在@jackwanders回答) :

var chars = { 
    "á" : "&aacute;", 
    "Á" : "&Aacute;", 
    "é" : "&eacute;", 
    "É" : "&Eacute;", 
    ... 
} 
return input.replace(/[^ -~]/g, function(chr) { 
    return (chr in chars) 
     ? chars[chr] 
     : "&#"+chr.charCodeAt(0)+";"; 
}); 

然而,你应该永远不需要在JavaScript中使用HTML实体。使用UTF8作为所有内容的字符编码,它将起作用。

+0

使用@jackwanders答案,在代码的第二部分,我该如何放置字符?如果我尝试使用**/\ u00E1/**格式,则会出现错误。 – SeinopSys 2012-08-02 17:58:27

+0

你在哪里使用它?如果你仍然有错误的编码,你需要转义地图对象的键。 – Bergi 2012-08-02 18:03:52

我以为你是只更换一个字符的第一个实例的问题。在JavaScript中,你必须specifiy使用正则表达式这样的全球性替代对象:

var rtz0 = qwe.replace(new RegExp("á", "g"), "&aacute;"); 

这将是最好的,因为通过PPvG或jackwanders提到创建一个数组,但在其他方面ATLEAST重用现有的变量。你可以很容易地做到这一点是这样的:

qwe = qwe.replace(new RegExp("á", "g"), "&aacute;"); 
qwe = qwe.replace(new RegExp("Á", "g"), "&Aacute;"); 
+0

这不起作用:\ – SeinopSys 2012-08-02 17:18:22

+0

就像我说的,这种方法只是再次,返回值,因为它没有做任何事情。 – SeinopSys 2012-08-02 17:29:31

+0

@ DJDavid98我同意这似乎不是它不替换的原因,但是您需要按照我的建议进行全局替换。我也强烈建议使用PPvG和jackwanders提到的阵列。 – 2012-08-02 17:33:33

你可以创建一个具有键/值对的对象的每个字符来代替:

var chars = { 
    "á" : "&aacute;", 
    "Á" : "&Aacute;", 
    "é" : "&eacute;", 
    "É" : "&Eacute;", 
    ... 
} 

,然后在.replace调用中使用的函数:

var uio = qwe.replace(/[áÁéÉ]/g,function(c) { return chars[c]; }); 

你的对象,正则表达式显然需要扩大,包括所有你要替换

人物3210

这些字符受HTML页面,JavaScript页面和HTTP请求的编码影响。尝试用它们的Unicode等值替换字符:

<a id="reminder1" onclick="document.getElementById('reminder2').style.display = ''; document.getElementById('reminder1').style.display = 'none';"> 
    Set reminder 
</a> 
<a id="reminder2" class="reminder" style="display:none;"> 
    <input type="text" id="reminderh" size=40 style="font-size:20px;"> 
    <input type="button" value="Set" onclick="csere(document.getElementById('reminderh').value);"> 
</a> 

<script> 
function csere(qwe){ 
document.getElementById('reminder2').style.display = 'none'; 

var rtz0 = qwe.replace(/\u00E1/,"&aacute;"); 
var rtz1 = rtz0.replace(/\u00C1/,"&Aacute;"); 

var rtz2 = rtz1.replace(/\u00E9/,"&eacute;"); 
var rtz3 = rtz2.replace(/\u00C9/,"&Eacute;"); 

var rtz4 = rtz3.replace(/\u00ED/,"&iacute;"); 
var rtz5 = rtz4.replace(/\u00CD/,"&Iacute;"); 

var rtz6 = rtz5.replace(/\u00F6/,"&ouml;"); 
var rtz7 = rtz6.replace(/\u00D6/,"&Ouml;"); 
var rtz8 = rtz7.replace(/\u00F5/,"&&#337;"); 
var rtz9 = rtz8.replace(/\u00D5/,"&#336;"); 
var rtz10 = rtz9.replace(/\u00F3/,"&oacute;"); 
var rtz11 = rtz10.replace(/\u00D3/,"&Oacute;"); 

var rtz12 = rtz11.replace(/\u00FC/,"&uuml;"); 
var rtz13 = rtz12.replace(/\u00DC/,"&Uuml;"); 
var rtz14 = rtz13.replace(/\u0171/,"&#369;"); 
var rtz15 = rtz14.replace(/\u0170/,"&#368;"); 
var rtz16 = rtz15.replace(/\u00FA/,"&uacute;"); 
var uio = rtz16.replace(/\u00DA/,"&Uacute;"); 

//Creates a cookie with the final value (different function) 
createCookie('reminder',uio,1500); 

document.getElementById('reminder1').style.display = ''; 
} 
</script> 

仔细检查我的转换是否确定。我在Wikibooks上使用了网格。

+0

是的!谢谢你,看起来像Unicode替代解决它。 – SeinopSys 2012-08-02 17:31:34

+1

如果这是一个解决方案,那么你应该修复你的编码。无论如何,你应该改进你的算法,参见jackwanders的答案或我的。 – Bergi 2012-08-02 17:43:09

+1

这只会替换每个角色的第一个实例。这里是一个例子:http://jsfiddle.net/hHZhv/1 – 2012-08-02 18:03:35