11

この素敵なコードを手に入れましたが、なぜ機能しないのかわかりません。互換性のために、テキスト入力の値を取得し、指定された各国の文字をその HTML コードに置き換える必要があります。しかし、ボタンをクリックすると、関数は何も変更せずに文字列を返します。何か案が?

( 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>
4

4 に答える 4

10

置換する各文字のキーと値のペアを持つオブジェクトを作成できます。

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

次に、.replace呼び出しで関数を使用します。

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

オブジェクトと正規表現は、置き換えたいすべての文字を含むように大きくする必要があることは明らかです

于 2012-08-02T17:25:59.330 に答える
9

名前付きエンティティを使用せずに、プログラムですべてを置き換えることができます。

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 を使用すると、動作します。

于 2012-08-02T17:36:47.807 に答える
3

文字は、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のグリッドを使用しました。

于 2012-08-02T17:27:27.890 に答える
1

キャラクターの最初のインスタンスのみを置き換えることに問題があると思います。JavaScript では、次のように正規表現を使用してグローバル置換を指定する必要があります。

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

PPvG または jackwanders で言及されているように配列を作成するのが最善ですが、それ以外の場合は少なくとも既存の変数を再利用します。次のように簡単に実行できます。

qwe  = qwe.replace(new RegExp("á", "g"), "&aacute;");
qwe  = qwe.replace(new RegExp("Á", "g"), "&Aacute;");
于 2012-08-02T17:15:10.020 に答える