同时替换多个字符jquery

时间:2017-11-26 22:34:32

标签: javascript jquery replace

我正在尝试替换此代码中的多个字符,但显然它不起作用的字符是:

A>>中号

M>>甲

如您所见A必须更改为M且M必须更改为A,依此类推为其他

<!DOCTYPE html>
<html>
<head>
<script src="jquery.min.js"></script>
<script>
$(document).ready(function(){
    $("button").click(function(){
     var text = $("textarea").val();

text=text.replace(/A/g,'M');
text=text.replace(/[M_]/g,'A');
text=text.replace(/[T_]/g,'T');
text=text.replace(/[R_]/g,'E');
text=text.replace(/[I_]/g,'I');
text=text.replace(/[O_]/g,'R');
text=text.replace(/[V_]/g,'V');
text=text.replace(/[P_]/g,'O');
text=text.replace(/[U_]/g,'U');
text=text.replace(/[Z_]/g,'P');
text=text.replace(/[S_]/g,'S');
text=text.replace(/[X_]/g,'Z');
text=text.replace(/[K_]/g,'K');
text=text.replace(/[W_]/g,'X');
text=text.replace(/[Q_]/g,'Q');



text=text.replace(/[a_]/g,'m');
text=text.replace(/[m_]/g,'a');
text=text.replace(/[e_]/g,'t');
text=text.replace(/[t_]/g,'e');
text=text.replace(/[r_]/g,'i');
text=text.replace(/[i_]/g,'r');
text=text.replace(/[o_]/g,'v');
text=text.replace(/[v_]/g,'o');
text=text.replace(/[p_]/g,'u');
text=text.replace(/[u_]/g,'p');
text=text.replace(/[z_]/g,'s');
text=text.replace(/[s_]/g,'z');
text=text.replace(/[x_]/g,'k');
text=text.replace(/[k_]/g,'x');
text=text.replace(/[w_]/g,'q');
text=text.replace(/[q_]/g,'w');
text=text.replace(/[=_]/g,'/');
text=text.replace(/[@_]/g,'+');
text=text.replace(/[+_]/g,'@');



        $('p').html(text);
    });
});
</script>
</head>

<body>

<textarea  name="paragraph_text" cols="50" rows="10"></textarea>
<br>
<button text="fsd">click me</button>


<p></p>
<html>

` 你能告诉我什么是问题,当我点击按钮时,只有一两个字符被替换,

1 个答案:

答案 0 :(得分:0)

正如评论中提到的,当你有这样的代码时:

text=text.replace(/A/g,'M');
text=text.replace(/[M_]/g,'A');

...您首先将A更改为M,然后立即再将其更改回来。此外,这会将所有下划线字符更改为A,这意味着在[T_][R_]等正则表达式中具有下划线的所有以下行都是多余的,因为没有下划线留给找到。

还有这样的行:

text=text.replace(/[V_]/g,'V');

...根本不做任何事情,因为替换是您匹配的相同角色(如前所述,此时不会留下任何下划线)。

我建议对整个事情采用不同的方法。您可以使用包含要替换的所有字符的正则表达式对.replace()进行一次调用,然后在.replace()的第二个参数中提供替换字符串,而不是基于查找表进行替换的回调函数,可能有点像这样:

&#13;
&#13;
$(document).ready(function() {
  var regex = /[_AMTRIOVPUZSXKWQametriovpuzsxkwq=@+]/g;
  var replacements = { '_': 'M', 'A': 'M', 'M': 'A', 'T': 'T', 'R': 'E', 'I': 'I', 'O': 'R', 'V': 'V', 'P': 'O', 'U': 'U', 'Z': 'P', 'S': 'S', 'X': 'Z', 'K': 'K', 'W': 'X', 'Q': 'Q', 'a': 'm', 'm': 'a', 'e': 't', 't': 'e', 'r': 'i', 'i': 'r', 'o': 'v', 'v': 'o', 'p': 'u', 'u': 'p', 'z': 's', 's': 'z', 'x': 'k', 'k': 'x', 'w': 'q', 'q': 'w', '=': '/', '@': '+', '+': '@' };

  $("button").click(function() {
    var text = $("textarea").val();
    text = text.replace(regex, function(match) { return replacements[match]; });
    $('p').html(text);
  });
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<textarea name="paragraph_text" cols="50" rows="10"></textarea>
<br>
<button text="fsd">click me</button>
<p></p>
&#13;
&#13;
&#13;

如果不明显,每次匹配时会调用一次回调函数,并将匹配的文本作为参数,并且该匹配的替换值是回调函数返回的值。