无法用PHP替换POST请求中的智能引号

时间:2016-01-15 17:37:41

标签: php forms post http-post

我无法使用str_replace单一' smart'引用(')但仅当它作为$ _POST请求传递时。

确切的问题是我的客户端正在从浏览器中复制和粘贴,其中引号是从’呈现的。当他将文本粘贴到表单中时,它会更新数据库条目,只要卷曲引用在数据库中,整个站点就会中断。我没有创建他的网站,所以尝试找出这个问题的原因很痛苦,但我确实将其缩小到复制和粘贴卷曲引号。因此,我的第一个简单解决方案就是在它们通过POST后立即替换它们。

这里可以看到一个例子:

http://wheatbeakinc.com/quote.php

这是确切的源代码:

<div style="font-size:30px;">

<?php

if(isset($_POST["text"])){

    $foo = str_replace("’","'","tes’t");

    $chr_map = array(
   // Windows codepage 1252
   "\xC2\x82" => "'", // U+0082⇒U+201A single low-9 quotation mark
   "\xC2\x84" => '"', // U+0084⇒U+201E double low-9 quotation mark
   "\xC2\x8B" => "'", // U+008B⇒U+2039 single left-pointing angle quotation mark
   "\xC2\x91" => "'", // U+0091⇒U+2018 left single quotation mark
   "\xC2\x92" => "'", // U+0092⇒U+2019 right single quotation mark
   "\xC2\x93" => '"', // U+0093⇒U+201C left double quotation mark
   "\xC2\x94" => '"', // U+0094⇒U+201D right double quotation mark
   "\xC2\x9B" => "'", // U+009B⇒U+203A single right-pointing angle quotation mark

   // Regular Unicode     // U+0022 quotation mark (")
                          // U+0027 apostrophe     (')
   "\xC2\xAB"     => '"', // U+00AB left-pointing double angle quotation mark
   "\xC2\xBB"     => '"', // U+00BB right-pointing double angle quotation mark
   "\xE2\x80\x98" => "'", // U+2018 left single quotation mark
   "\xE2\x80\x99" => "'", // U+2019 right single quotation mark
   "\xE2\x80\x9A" => "'", // U+201A single low-9 quotation mark
   "\xE2\x80\x9B" => "'", // U+201B single high-reversed-9 quotation mark
   "\xE2\x80\x9C" => '"', // U+201C left double quotation mark
   "\xE2\x80\x9D" => '"', // U+201D right double quotation mark
   "\xE2\x80\x9E" => '"', // U+201E double low-9 quotation mark
   "\xE2\x80\x9F" => '"', // U+201F double high-reversed-9 quotation mark
   "\xE2\x80\xB9" => "'", // U+2039 single left-pointing angle quotation mark
   "\xE2\x80\xBA" => "'", // U+203A single right-pointing angle quotation mark
);
$chr = array_keys  ($chr_map); // but: for efficiency you should
$rpl = array_values($chr_map); // pre-calculate these two arrays
$bar = str_replace($chr, $rpl, html_entity_decode($_POST["text"], ENT_QUOTES, "UTF-8"));

        echo "foo: " . $foo . " - <em>shows straight quote (for me)</em><br /><br >";
        echo "bar: " . $bar . " - <em>still shows curly quote (for me)</em><br /><br >";    

}

?>


Copy this into the input: tes&rsquo;t

<form action="" method="post">

<input type="text" name="text" />
<br>
<br>
<input type="submit" value="Submit" />

</form>

</div>

如果我在表单中填写完全相同的字符串(tes't)并点击提交,它将给出以下结果:

  

foo:tes&#t; t

     

bar:tes't

即使字符串相同,也不会替换通过帖子的字符串。有谁知道为什么会这样?

这不是另一个问题的重复,并且该解决方案不起作用。

1 个答案:

答案 0 :(得分:1)

经过测试(我怀疑它是编码问题;我不小心删除了我对此的评论),我能够找出你的代码失败的原因。

这是因为您的文件编码可能设置为UTF-8 而没有 BOM。

如果是这种情况,请使用 BOM(字节顺序标记)将其更改为,它将按预期工作。

参考:

诺塔:

将文件保存为ANSI编码,也使用常规引号替换卷曲引号,因此您可以选择。作为ANSI,或带有BOM的UTF-8。

您可以使用Notepad ++之类的编辑器。

从下拉菜单中,您可以选择:

  • 编码,转换为带有BOM的UTF-8,然后保存。
  • 或者,编码,转换为ANSI,然后保存。
  • 选择权在您手中。

重要的旁注:请勿选择“在...中编码”,因为保存后不会转换文件。您必须选择“转换为”。

您可以使用其他代码编辑器,这将为您提供相同的结果。