zua*_*auz 20 php json jsonp escaping str-replace
好的我正在运行一个公共JSONP API,数据从我的PHP服务器提供.我刚读过这篇文章:
基本上,如果我的JSON字符串包含U + 2028字符(Unicode行分隔符)或U + 2029字符(Unicode段分隔符),那么这是完全有效的JSON.但是,当使用JSONP时,JSON将作为JavaScript执行,并且JavaScript中的任何字符串都不能包含文字U + 2028或U + 2029,因为它会破坏JavaScript.显然,只要您使用正确的JSON解析器,这通常不是问题,但在JSONP的情况下,浏览器是 JSON解析器.
基本上,如果这些字符在我的JSONP数据中的字符串内部被发送到客户端,则会在字符串中抛出一行或一个段落,这会破坏JavaScript并阻止它执行.这是一种可能性,因为API正在发回一些客户端输入的数据.有人可能会在数据库中输入U + 2028或U + 2029,因此当我将其作为JSONP发回时,它将使用我的API中断任何实现.
所以我的问题是,在PHP中如何清除/输出转义JSON数据以删除或转义U + 2028和U + 2029字符,然后再将其发送到客户端?
目前,我的进程正在对数据数组执行json_encode并将该数据发送到客户端.我应该通过循环遍历数组并过滤它来转义数据,还是一次性转义所有JSON编码的字符串?
另一件事是我不知道如何在PHP中逃避U + 2028和U + 2029字符.我可以做一个str_replace吗?我不确定str_replace是否是多字节安全的,并且没有mb_str_replace函数,除非我使用一些自定义的.那你如何删除/逃脱那些unicode字符?
非常感谢.
Die*_*Epp 23
您可以替换U+2028
,U+2029
与"\u2028"
,"\u2029"
无论是在PHP端或JavaScript端,或两者兼而有之,它不只要它发生至少一次(它的幂等)关系.
您可以使用普通的字符串替换功能.它们不需要是"多字节安全的",你可以在任何Unicode编码中轻松完成(UTF-8,UTF-16,UTF-32都同样好).上次我检查时,PHP没有Unicode转义序列,这只是PHP是一个笑话的另一个原因,但你可以使用\x
UTF-8转义...
(简而言之,没有多字节字符串替换函数的原因是因为它将是多余的 - 它将与非多字节字符串替换函数完全相同.)
// Javascript
data = data.replace("\u2028", "\\u2028").replace("\u2029", "\\u2029");
// PHP
$data = str_replace("\xe2\x80\xa8", '\\u2028', $data);
$data = str_replace("\xe2\x80\xa9", '\\u2029', $data);
Run Code Online (Sandbox Code Playgroud)
或者你根本不做任何事情,因为PHP在默认情况下会转义非Unicode字符json_encode()
:
// Safe
echo json_encode("\xe2\x80\xa9");
--> "\u2029"
// Correct JSON, but invalid Javascript...
// (Well, technically, JSON root must be array or object)
echo json_encode("\xe2\x80\xa9", JSON_UNESCAPED_UNICODE);
--> "
"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14916 次 |
最近记录: |