I am unable to use str_replace a single 'smart' quote (’) but only if it's passed as a $_POST request.
The exact problem is that my client is copying and pasting from a browser in which the quotes are rendered from ’
. When he pastes the text into the form it updates a database entry, as long as the curly quote is in the database the entire site breaks. I didn't create his site so it's a pain to try and track down the cause of this problem but I did narrow it down to copying and pasting curly quotes. Therefore my first simple solution was to just replace them as soon as they came over POST.
An example can be seen here:
http://wheatbeakinc.com/quote.php
This is the exact source code:
<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’t
<form action="" method="post">
<input type="text" name="text" />
<br>
<br>
<input type="submit" value="Submit" />
</form>
</div>
if I fill in the exact same string (tes’t) in the form and hit submit, it will give the following result:
foo: tes't
bar: tes’t
Even though the strings are identical the one passed through post is not replaced. Does anyone know why this is happening?
This is not a duplicate of the other question, and that solution does not work.