如何对一个字符串进行反转义?

6

使用ajax的get方法传递变量,需要使用escape()函数对字符串进行转义。

在php中,我接收这个值并将其插入到数据库中。

如何取消转义字符串?

例如:

balaji's

我明白了

balaji%27s.
5个回答

9
您可以尝试以下方法:
htmlspecialchars(urldecode($str));

请改善您的语法,即使对于编辑来说,您所说的内容也不够清晰。 - Badasahog

9
您可以使用此函数替代urldecode()。
function utf8_urldecode($str) {
        return html_entity_decode(preg_replace("/%u([0-9a-f]{3,4})/i", "&#x\\1;", urldecode($str)), null, 'UTF-8');
}

对我来说,了解 html_entity_decode($str, null, 'UTF-8') 可以解码像 "&#227" 这样转义的字符是很有用的。我在这里写下来,这样其他人如果遇到和我一样的问题就更容易看到了。 - VinGarcia

5

不要在客户端使用 escape,而应该使用 encodeURIComponentescape 不进行URI编码。(它执行类似的操作,但有足够的不同之处,可能会给你带来麻烦。)encodeURIComponent 执行标准的URI编码。如果您以正常方式发送数据,则PHP应自动对其进行解码,例如:

var word = "balaji's";
$.ajax({
    url: "yoururl",
    data: encodeURIComponent("word") + "=" + encodeURIComponent(word)
});

如果你不是以默认的"multipart form"表单方式发送数据(例如,你正在覆盖dataType),那么你需要通过urldecode进行手动解码。


@user:您需要发布完整的ajax调用和处理它的PHP代码。 - T.J. Crowder

1
考虑使用 PHP 函数 urldecode()rawurldecode()
看起来它们之间的一个区别在于处理 +(加号)的方式。
您应该确保测试包含加号的字符串,以确保选择了正确的函数。

1
无论是urldecode()还是rawurldecode(),都不能完全解码已经使用escape()转义的数据。一般的共识是应该使用encodeURIComponent()代替。 - Pekka
我点踩了,因为这个代码看起来可以工作很长时间,直到遇到一个函数不匹配的字符。没有针对@jedwards的个人攻击之意。 - Pekka
@Pekka,我认为要求OP改变编码方式有些自以为是了。问题不是“如何从头到尾完成这个任务”,而是“如何解码js的escape()函数生成的字符串”。此外,我不知道有任何字符被escape()编码后不能被urldecode()解码,你知道吗? - jedwards
1
如果在普通ASCII之外的UTF-8字符上使用escape(),它会生成像%u0710这样的字符串,而urldecode()无法解码。在这里更改编码方法确实是正确的做法。 - Pekka
啊,UTF-8——这种东西很容易被忘记,直到它破坏了你的代码——谢谢! - jedwards

-2

作为最后的手段,你可以尝试像这样做(此列表不是详尽无遗的,请自行补充)

$search = ["%20",'%3C','%3E','%3D','%22','%3A','%3B','%E0','%E9','%E8','%26','%E2', '%u2019'];
$replace = [' ', '<', '>', '=','"',':',';','à','é','è','&','â', '\''];

str_replace($search, $replace, $your_str);

1
不需要自己做,PHP已经内置了URL解码支持。 - Freggar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接