2010-09-03 1142 views
1

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

背景资料:用urlencode)
逃逸()的差异(:
@:未转换,应该是%40
&:考虑一个HTML实体,从而转义为%26安培%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}条件
/是基本的正则表达式标记字符

谢谢您的时间。

+1

为什么不使用JavaScript内置的encodeURIComponent()函数? http://www.w3schools.com/jsref/jsref_encodeuricomponent.asp – 2010-09-03 02:18:56

回答

0

你总是可以使用good ole的字符串数组访问。

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

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

它包含一个星号,而不是一个星号。 – Robusto 2010-09-03 02:22:49

+0

...和obelix) – 2016-08-01 20:54:31

4

是否有一个原因不是简单地在正则表达式中用反斜杠来转义*,+和/字符?

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

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

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

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

0

遗憾的是我没有使用相同的帐户,但所有的回应,这里有云:

布朗克先生,转义字符实际上在这种情况下不能正常工作,无论出于何种原因(可能是由于到他们的保留字符状态)。我忘了提及我试图逃脱他们xD。

霍先生,谢谢你的绕行解决方案。我会检查一下,看看它是否有效(它应该)。首先,字符串数组的访问将会是非常冗长的代码添加,尤其是在处理需要替换的三个额外字符时(我知道,它可能只是一个if /否则if/else if,但这仍然是相当多的代码)。 Oui,et biença足以证明法国文化。

关于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]; }); 
} 

显然其他人可能更改代码以不同的方式,使其工作,但对我来说,省去了避免替换的百分比符号串扰更方便。

再次感谢大家。