好吧,所以我目前正在使用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(/&/g, '%26').replace(/</g, '%3C').replace(/>/g, '%3E');
和@
可以替换,因为它不是保留的RegExp字符
*
代表{0}
有条件的
+
代表{1}
有条件的
/
是基本的RegExp标记字符
感谢您的时间。
答案 0 :(得分:6)
有没有理由不简单地在正则表达式中使用反斜杠转义*,+和/字符?
s = s.replace( /\*/g, 'star' );
答案 1 :(得分:3)
对我来说,链接replace
并不是很优雅。我会尝试:
var symbols = {
'@': '%40',
'&': '%26',
'*': '%2A',
'+': '%2B',
'/': '%2F',
'<': '%3C',
'>': '%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]; });
}
显然,其他人可能会以不同的方式更改代码以使其正常工作,但对我来说,消除串扰以避免替换的百分号更加方便。
再次感谢大家。