Microsoft Edge ajax奇怪的POST数据enconding

时间:2017-09-15 10:38:49

标签: php ajax codeigniter microsoft-edge

我正在使用CodeIgniter(PHP 7.1.1)开发一个网站,在客户端,我需要向服务器发送一些日期:

var date_str = date.toLocaleDateString();
var time_str = date.toLocaleTimeString().split(':');
time_str = time_str[0] + ':' + time_str[1];
...
data_to_ajax = {
    date: inicio,
    date2: termino
};
...

服务器将使用以下方式验证这些日期:

DateTime::createFromFormat('d/m/Y H:i', $date);
DateTime::createFromFormat('d/m/Y H:i', $date2);

它工作正常,除非使用microsoft Edge,createFromFormat将始终为发送日期返回false。要调试我发送的日期var_dump,我得到的是:

string(43) "29/08/2017 21:00"
string(31) "29/08/2017 23:30"

在chrome和mozilla中,我得到的是:

string(16) "29/08/2017 21:00"
string(16) "29/08/2017 23:30"

好吧,调试发送的http正文数据,chrome和mozilla将发送63个字节:

date_loc=29%2F08%2F2017+21%3A00&date_ter=29%2F08%2F2017+23%3A30

边缘发送189(63 * 3)字节:

date_loc=%E2%80%8E28%E2%80%8E%2F%E2%80%8E08%E2%80%8E%2F%E2%80%8E2017+%E2%80%8E21%E2%80%8E%3A%E2%80%8E00%E2%80%8E&date_ter=%E2%80%8E28%E2%80%8E%2F%E2%80%8E08%E2%80%8E%2F%E2%80%8E2017+23%3A30

两者似乎都是正确的,因为:url encoder/decoder可以解码它们,问题似乎与服务器有关,为什么php会显示具有相同字符数的两个字符串具有不同的长度? var_dump可以正常显示这些字符串更奇怪,但createDateFromFormat将失败。

1 个答案:

答案 0 :(得分:1)

Microsoft Edge将%E2%80%8E放入发送的数据中,这是一个Left-to-right mark,这会导致php函数出现问题:createDateFromFormat,因为Edge发送的字符串&#39} ; t符合指定的格式:d/m/Y H:i,你可以做的是使用格式字符串中的*doc)字符:*d*/*m*/*Y *H*:*i*或者你可以删除所有使用:

控制字符(Remove control characters from php String
$date = preg_replace('/[^\PC\s]/u', '', $date);