简体   繁体   English

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

[英]Replace multiple characters in a string in javascript

I got this nice code, which I have no idea why doesn't work. 我得到了这个很好的代码,我不知道为什么不起作用。 It should get the value of a text input and replace each given national character with it's HTML code, for compatibility purposes. 为了兼容性,它应该获取文本输入的值并用它的HTML代码替换每个给定的国家字符。 But, when I click the button, the function returns the string without any changes. 但是,当我单击按钮时,该函数返回字符串而不做任何更改。 Any idea? 任何想法?

( jsfiddle ) 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>

You could create an object that has key/value pairs for each character to replace: 您可以为要替换的每个字符创建一个具有键/值对的对象:

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

And then use a function in your .replace call: 然后在.replace调用中使用一个函数:

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

Your object and regular expression will obviously need to grow to include all the characters you want to replace 您的对象和正则表达式显然需要增长,以包含您要替换的所有字符

You can just replace everything programmatically, not using named entities: 您只需编程方式替换所有内容,而不是使用命名实体:

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)+";";
});

If you want to use named entities, you can combine this with a key-value-map (as like in @jackwanders answer): 如果要使用命名实体,可以将其与键值映射结合使用(如@jackwanders答案中所示):

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

However, you should never need to use html entities in JavaScript. 但是,您永远不需要在JavaScript中使用html实体。 Use UTF8 as the character encoding for everything, and it will work. 使用UTF8作为所有内容的字符编码,它将起作用。

The characters are subject to the encoding of the HTML page, the JavaScript page, and the HTTP request. 字符受HTML页面,JavaScript页面和HTTP请求的编码限制。 Try replacing the characters with their Unicode equivalents: 尝试使用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>

Double check my conversions to be sure. 请仔细检查我的转化情况。 I used the grid on Wikibooks . 我在Wikibooks上使用了网格。

I think you are having an issue with only replacing the first instance of a character. 我认为你只是替换了第一个角色的问题。 In javascript you have to specifiy global replaces using regex like this: 在javascript中,您必须使用正则表达式来指定全局替换,如下所示:

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

It would be best to create an array as mentioned by PPvG or jackwanders, but otherwise atleast reuse the existing variable. 最好创建一个PPvG或jackwanders所提到的数组,但除此之外至少要重用现有的变量。 You could easily do it like this: 你可以这样轻松地做到这一点:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM