Javascript替换字符串中的字符*,+和/

时间:2010-09-03 02:16:03

标签: javascript special-characters replace

好吧,所以我目前正在使用JS的escape()和一些字符串替换来模仿PHP的urlencode()函数的简单方式。我纯粹是看键盘字符,所以没有特殊的ASCII或Unicode字符。我遇到的问题是特定字符*,+和/ all在RegExp中具有特殊含义,并且看作JavaScript String Object方法使用RegExp参数,我无法完全复制PHP的urlencode()。那么,如何使用JS来管理字符串中的这些字符?

背景资料:
与urlencode()的escape()差异:
@:未转换,应为%40
&:被视为html实体,因此被转义为%26amp%3B而非%26
*:未转换,应为%2A
+:未转换,应为%2B
/:未转换,应为%2F
<:被视为html实体,因此被转义为%26lt%3B而不是%3C
>:被视为html实体,因此被转义为%26gt%3B而不是%3E

HTML实体转换就像

一样简单
str.replace(/&amp;/g, '%26').replace(/&lt;/g, '%3C').replace(/&gt;/g, '%3E');

@可以替换,因为它不是保留的RegExp字符 *代表{0}有条件的 +代表{1}有条件的 /是基本的RegExp标记字符

感谢您的时间。

4 个答案:

答案 0 :(得分:6)

有没有理由不简单地在正则表达式中使用反斜杠转义*,+和/字符?

s = s.replace( /\*/g, 'star' );

答案 1 :(得分:3)

对我来说,链接replace并不是很优雅。我会尝试:

var symbols = {
    '@': '%40',
    '&amp;': '%26',
    '*': '%2A',
    '+': '%2B',
    '/': '%2F',
    '&lt;': '%3C',
    '&gt;': '%3E'
};
str = str.replace(/([@*+/]|&(amp|lt|gt);)/g, function (m) { return symbols[m]; });

方便的是,这也避免了原来的问题。

答案 2 :(得分:0)

您总是可以使用良好的'字符串数组访问。

var myString = "Hello this is a string. * It contains an asterisk.";

for(var i = 0; i < myString.length; i++)
{
    if(myString[i] == '*')
    {
        alert(i);
    }
}​

答案 3 :(得分:0)

很抱歉,我没有使用同一个帐户,但回复所有问题,请点击:

先生。出于任何原因(可能是由于他们保留的角色状态),在这种情况下逃避角色的Plunkett实际上不起作用。我忘了提到我试图逃避它们xD。

先生。希望,谢谢您的旁路解决方案。我会检查出来,看看它是否有效(它应该)。

Mahir(محير?),首先,字符串数组访问将是一个非常冗长的代码添加,特别是在处理需要替换的三个额外字符时(是的,我知道,它可能只是一个if / else if / else if,但那仍然是相当多的代码)。 Oui,etbiençafunitde dire qu'il estmoncaractèrefavorit delalittératureFrançaise。

关于William的回答,如果你做一些研究,你会注意到encodeURIComponent()实际上并不编码由PHP的urlencode()编码的大量字符。整个问题的目的是在JS中构建urlencode()的简单副本。

非常感谢大家的回复,非常感谢。

- addendum--
希望先生的代码有效,只需一个调整:

function urlencode(str) {
   var symbols = {
      '@': '%40',
      '%26amp%3B: '%26',
      '*': '%2A',
      '+': '%2B',
      '/': '%2F',
      '%26lt%3B': '%3C',
      '%26gt%3B': '%3E'
   };
   return escape(str).replace(/([@*+/]|%26(amp|lt|gt)%3B)/g, function (m) { return symbols[m]; });
}

显然,其他人可能会以不同的方式更改代码以使其正常工作,但对我来说,消除串扰以避免替换的百分号更加方便。

再次感谢大家。