私は国際的なキーボードの仕組みをエミュレートしようとしています。文字の後にdead keysのいずれかを使用すると、それらを対応する文字に結合します。例えば、`a
に入力するとô
でà
と^o
結果になるだろう、など国際文字(発音記号)を作るために文字を置換する
私は(私は正規表現で吸う!)私の正規表現が適切に動作するように見えることはできませんが、これは私がこれまで持っているものです(demo):あなたがこれと同じことを行うために、より効率的な方法を知っていれば
var txt = "Replacing 'a ^u ~n 'e ^I 'c",
combos = {
'a': ['à', 'á', 'ä', 'â'],
'A': ['À', 'Á', 'Ä', 'Â'],
'e': ['è', 'é', 'ë', 'ê'],
'E': ['È', 'É', 'Ë', 'Ê'],
'i': ['ì', 'í', 'ï', 'î'],
'I': ['Ì', 'Í', 'Ï', 'Î'],
'o': ['ò', 'ó', 'ö', 'ô'],
'O': ['Ò', 'Ó', 'Ö', 'Ô'],
'u': ['ù', 'ú', 'ü', 'û'],
'U': ['Ù', 'Ú', 'Ü', 'Û'],
'y': 'ý',
'Y': 'Ý',
'c': 'ç',
'C': 'Ç',
'n': 'ñ',
'N': 'Ñ'
},
bslash = /`[(aeiou)]/gi,
fslash = /\'[(aeiouyc)]/gi,
ddots = /\"[(aeiou)]/gi,
caret = /\^[(aeiou)]/gi,
tidle = /~[(n)]/gi;
// global match
if (txt.match(/[`|\'|\"|\^|~][aeiouycn]/i)) {
// back slash - replace `a with à
if (bslash.test(txt)) {
txt = txt.replace(bslash, function(r) {
// r contains the `, so remove it with a slice
return combos[r.slice(-1)][0];
});
}
// forward slash - replace 'a with á, etc
if (fslash.test(txt)) {
txt = txt.replace(fslash, function(r) {
r = r.slice(-1);
return (r == 'c' || r == 'y') ? combos[r][0] : combos[r][3];
});
}
// double dots - replace `a with à
if (ddots.test(txt)) {
txt = txt.replace(ddots, function(r) {
return combos[r.slice(-1)][4];
});
}
// caret - replace ^a with â
if (caret.test(txt)) {
txt = txt.replace(caret, function(r) {
return combos[r.slice(-1)][3];
});
}
// tidle - replace ~n with ñ
if (tidle.test(txt)) {
txt = txt.replace(tidle, function(r) {
return combos[r.slice(-1)][0];
});
}
document.write(txt);
}
また、私はそれを聞くのが大好きです!
私は上記の問題をAefxxの問題点で修正しました - ありがとう!しかし、私はケニーの方法と一緒に行くことに決めました。 :)(updated demo)
var txt = "Replacing 'a ^u ~n 'e ^I 'c",
combos = {
'`' :{ a:'à', A:'À', e:'è', E:'È', i:'ì', I:'Ì', o:'ò', O:'Ò', u:'ù', U:'Ù' },
"'" :{ a:'á', A:'Á', e:'é', E:'É', i:'í', I:'Í', o:'ó', O:'Ó', u:'ú', U:'Ú', y:'ý', Y:'Ý', c:'ç', C:'Ç' },
'"' :{ a:'ä', A:'Ä', e:'ë', E:'Ë', i:'ï', I:'Ï', o:'ö', O:'Ö', u:'ü', U:'Ü' },
'^' :{ a:'â', A:'Â', e:'ê', E:'Ê', i:'î', I:'Î', o:'ô', O:'Ô', u:'û', U:'Û' },
'~' :{ n:'ñ', N:'Ñ' }
};
txt = txt.replace(/([`\'~\^\"])([a-z])/ig, function(s, accent, letter){
return (accent in combos) ? combos[accent][letter] || s : s;
});
document.write(txt);
ありがとう...アクセントをキーとして使用することを考えましたが、オブジェクトがすでに持っていたものよりも大きくなると思いました。それは清潔であることが分かります:) – Mottie