超薄形式不发布智能字符和单词“从”

时间:2017-10-13 19:00:42

标签: php ajax slim

我有一个表单,大多数用户会粘贴电子邮件中的内容,所以这当然有一堆特殊/智能字符,因为Outlook。因此,我使用JS代码在通过ajax post提交之前替换字符。我也JSON.stringify它。我在SLIM v3上,所以它确实通过一个路由到一个控制器文件,然后最终一个服务文件。在服务文件中它有一个json_decode,然后它再次删除任何特殊/智能字符。然后将其保存到DB。此外,我正在使用PDO准备语句,该问题仅存在于centos apache上,但不存在于我的本地Windows开发环境中。

我的问题是有些内容会保存而有些内容则不会。不保存的唯一共性是有时内容中包含“from”一词。当我改为单词“from”到“From”时,它会保存。

很难找到它失败的地方,因为我得到的唯一错误是“方法不允许。必须是:POST”我的JS正在使用帖子,而Slim中的路由知道期待发布。

两次替换字符和stringify似乎有点矫枉过正,但我​​只想掩盖我的基础。

我正在寻找任何可以尝试的建议。

这是替换Microsoft字符的JS。我在stackoverflow上找到了它。

cleanText: function(text) {
var s = text;
// smart single quotes and apostrophe
s = s.replace(/[\u2018\u2019\u201A]/g, "\'");
// smart double quotes
s = s.replace(/[\u201C\u201D\u201E]/g, "\"");
// ellipsis
s = s.replace(/\u2026/g, "...");
// dashes
s = s.replace(/[\u2013\u2014]/g, "-");
// circumflex
s = s.replace(/\u02C6/g, "^");
// open angle bracket
s = s.replace(/\u2039/g, "<");
// close angle bracket
s = s.replace(/\u203A/g, ">");
// spaces
s = s.replace(/[\u02DC\u00A0]/g, " ");

return s;
}

这是我将其字符串化的地方:

collectFieldValues: function() {
var params = {
record: this.settings.record,
module: this.settings.module,
note: JSON.stringify(Notes.cleanText($('#mn-note').val())),
noteID: $('#note_id').val(),
visibility: $('#mn-visibility').val(),
};
return params;
},

这是PHP插入代码:

public function insert($table, $data, $display = false, $execute = true) {
    $fields = $this->filter($table, $data);

    $sql = "INSERT INTO " . $table . " (" . implode($fields, ", ") . ") VALUES (:" . implode($fields, ", :") . ");";
    $bind = array();
    foreach ($fields as $field) {
        $bind[":$field"] = $data[$field];
    }

    if ($this->run($sql, $bind, $display, $execute) !== false) {
        return intval($this->lastInsertId());
    }
    return 0;
}

这是在插入之前收集参数的地方:

        $note = $this->target->insert('notes', [
        "linkID"     => $this->app->hasher->decode($attributes['record']),
        'type'       => $attributes['module'],
        'visibility' => $attributes['visibility'],
        'note'       => $this->cleanText(json_decode($attributes['note'], true)),
        'created'    => $now->format('Y-m-d H:i:s'),
        'author'     => $userID,
    ]);

这是PHP代码,它在文本进入db之前清理它。有更全面的东西吗?我尝试使用neitanod / forceutf8包,但这没有帮助。

    public function cleanText($string)
{
    $search = [                 // www.fileformat.info/info/unicode/<NUM>/ <NUM> = 2018
                    "\xC2\xAB",     // « (U+00AB) in UTF-8
                    "\xC2\xBB",     // » (U+00BB) in UTF-8
                    "\xE2\x80\x98", // ‘ (U+2018) in UTF-8
                    "\xE2\x80\x99", // ’ (U+2019) in UTF-8
                    "\xE2\x80\x9A", // ‚ (U+201A) in UTF-8
                    "\xE2\x80\x9B", // ? (U+201B) in UTF-8
                    "\xE2\x80\x9C", // “ (U+201C) in UTF-8
                    "\xE2\x80\x9D", // ” (U+201D) in UTF-8
                    "\xE2\x80\x9E", // „ (U+201E) in UTF-8
                    "\xE2\x80\x9F", // ? (U+201F) in UTF-8
                    "\xE2\x80\xB9", // ‹ (U+2039) in UTF-8
                    "\xE2\x80\xBA", // › (U+203A) in UTF-8
                    "\xE2\x80\x93", // – (U+2013) in UTF-8
                    "\xE2\x80\x94", // — (U+2014) in UTF-8
                    "\xE2\x80\xA6"  // … (U+2026) in UTF-8
        ];

        $replacements = [
                    "<<",
                    ">>",
                    "'",
                    "'",
                    "'",
                    "'",
                    '"',
                    '"',
                    '"',
                    '"',
                    "<",
                    ">",
                    "-",
                    "-",
                    "..."
        ];

    return str_replace($search, $replacements, $string);
}

0 个答案:

没有答案