2016-09-30 89 views
2

作为一种做法,我试图创建一个假的“翻译”,将英语转换为使用.replace英文字母的混乱版本,但是我有一个问题,即替换操作替换之前替换的字母。防止替换已替换的字母

有没有办法让我防止代码重新替换已被替换的字母?

我的HTML:

<button onclick="Function()">click</button> 

<p id="let">a b c d e f g h i j k l m n o p q r s t u v w x y z</p> 

<p id="demor"></p> 

我的javascript:

function Function() { 
    var str = document.getElementById("let").innerHTML; 
    var txt = str.replace(/a/g,"x").replace(/b/g,"b").replace(/c/g,"c").replace(/d/g,"d").replace(/e/g,"a").replace(/f/g,"k").replace(/g/g,"s").replace(/h/g,"r").replace(/i/g,"e").replace(/j/g,"i").replace(/k/g,"d").replace(/l/g,"r").replace(/m/g,"z").replace(/n/g,"m").replace(/o/g,"s").replace(/p/g,"v").replace(/q/g,"p").replace(/r/g,"r").replace(/s/g,"k").replace(/t/g,"s").replace(/u/g,"i").replace(/v/g,"q").replace(/w/g,"v").replace(/x/g,"x").replace(/y/g,"e").replace(/z/g,"b"); 
    document.getElementById("demor").innerHTML = txt; 
} 

任何帮助将不胜感激!

+0

创建一个对象,并使用一个键值对,以确定应该是什么什么,而不是做'.replace'这么多次:■ –

+0

这里是“乔纳斯W公司的代码的演绎下方施加用一些方便的'pseduo loc'字母替换:https://jsfiddle.net/7snz7n4f/ –

回答

0

这是令人难以置信的效率低下,而且应该传达出一般的想法 - 基本上你分割字符串所以它是一个字符数组,然后运行上的每个字符替换:

var map = { a: 'x', b: 'b', c: 'c', d: 'd', e: 'a', f: 'k', g: 's', h: 'r', i: 'e', j: 'i', k: 'd', l: 'r', m: 'z', n: 'm', o: 's', p: 'v', q: 'p', r: 'r', s: 'k', t: 's', u: 'i', v: 'q', w: 'v', x: 'x', y: 'e', z: 'b' }; 

function Function() { 
    var str = "a b c d e f g h i j k l m n o p q r s t u v w x y z"; 
    var txt = str.split('').map(function(c) { 
     return map[c]; 
    }).join(''); 
    console.log(txt); 
} 
+0

这并不能解决问题。用户不希望被替换的字母再次被替换:a-> x-> b - > e或者那样 –

+0

@Jonasw这确实解决了这个问题。除非你误解了这个问题?例如,他想改变f - > k,然后当它到达k(最初是f)时,他不希望它再次改变,因为它已被替换。每个角色只能更换一次。这解决了这个问题。 – dave

+0

但是你的代码不能用str来替换g中的g,用这个结果替换b中的g ...因此实际上也是这样做的? –

0

我会去不同的方式 - 创建一个数字,这将是信件的重新排序。

结构示例:

var nums={ 
    1:"a", 
    2:"b", 
    3:"c", 
    4:"d" 
...//rest 
} 

下一页改变原单文本数字:

str.replace(/a/g,"1").replace(/b/g,"2") ... 

最后是做第二更换,但到最后的字母

str.replace(/1/g,nums[1]).replace(/2/g,nums[2]) ... 

所以我们肯定这一变化将不会被过分重视。我的js代码在答案中是伪代码,我只想显示这个想法。最重要的是数字应该像识别符一样,因此必须是唯一的。

0

您的解决方案将为每次替换扫描整个字符串一次。更好地发挥字符焦点,依次对每个字符进行翻译。

这是一个快速和肮脏的版本,削减到只包括小写字母 - 你可以整理一下,使它覆盖任何你喜欢的字符范围:

var input = "helloworld"; 
var xlate = "bcdefghijklmnopqrstuvwxyza"; 
var asciiA = 'a'.charCodeAt(); 

var out = ""; 
for(i=0;i<input.length;i++) { 
    out = out + xlate[input[i].charCodeAt() - asciiA]; 
} 

alert(out); 
0

好吧,我认为不能被用做替代,这就是我怎么会做到这一点:

//create translation arrays 
var letters=["a","b",...]; 
var replacewith=["x","b",...]; 

//move the string to an array 
var string="abc"; 
var arr=string.split(""); 
for(i=0;i<arr.length;i++){ 
for(o=0;o<letters.length;o++){ 
if(arr[i]==letters[o]){ 
//replace 
arr[i]=replacewith[o]; 
//stop replacing 
break; 
} 
} 
} 
string=arr.join(""); 

字符串替换字符...

0

随着我replace-once包,你可以做次E采用:

const replaceOnce = require('replace-once') 

var str = 'a b c d e f g h i j k l m n o p q r s t u v w x y z' 
var find = 'abcdefghijklmnopqrstuvwxyz' 
var replace = 'xbcdaksreidrzmsvprksiqvxeb' 
replaceOnce(str, find.split(''), replace.split(''), 'gi') 
//=> 'x b c d a k s r e i d r z m s v p r k s i q v x e b'