使用htmlspecialchars($str)
得到一个编码字符串。
当在页面上包含此字符串时,用户会看到字符串“键入时”。
页面源显示该字符串实际上已编码为"
等...
一切正常。
我将如何向用户显示编码后的字符串,以便他准确地看到其编码方式?如果可能的话,我不希望使用textarea。
...在理解这个问题方面似乎有些挑战。让我们做一个简单的例子。
$encodedString = htmlspecialchars(userInput:My favourite quote: "I can resist everything except temptation.");
$userMessage = 'You\'ve entered <'.$encodedString.'>';
echo $userMessage;
我希望用户看到You've entered <My favourite quote: "I can resist everything except temptation.">
。
这个愚蠢的例子很好地说明了这个问题。我不想将$ userMessage发送到htmlspecialchars,因为它也会触摸我自己的“ <”和“>”。
同样,问题是:我可以echo $userMessage;
到屏幕上,以便用户完全看到我构造的字符串吗?
答案 0 :(得分:1)
我看到此页面使用某种双重编码:
<code>&quot;</code>
。是这样吗?
首先,您不应将您输入的代码与用于输出该页面的代码混淆。当您在此站点上输入代码时,在键入内容时会运行一些Javascript以将您键入的内容呈现为HTML标记,该标记会立即显示在浏览器中。这种行为耗费了一些开发人员的精力,汗水和眼泪,可能与您想要在您的网站上发生的事情无关。因此,让我们暂时忽略它。
在您的网站上显示内容的正确方法可能取决于您是否使用了任何框架等,但是您似乎要问的基本问题是如何显示php的htmlspecialchars函数的输入和输出。
是否可以避免双重编码?
问这个问题很有趣,因为您可能要做想要对文本进行双重编码以获得所需的结果。我们在这里讨论几个代码概念。首先是您的计划文本。也许是这样的:
here is my "plaintext", OK?
如果您在这样的PHP函数中对此调用htmlspecialchars:
$str = 'here is my "plaintext", OK?';
echo $str . "<br>\n";
echo htmlspecialchars($str) . "<br>\n";
如果从命令行运行此PHP代码,则会看到其文本输出,如下所示:
here is my "plaintext", OK?<br>
here is my "plaintext", OK?<br>
如果您在网络服务器上运行该PHP代码并在网络浏览器中查看结果,则您的网络浏览器正在读取完全相同的文本,但是它将输出呈现为HTML ,因此显示为所以:
here is my "plaintext", OK?
here is my "plaintext", OK?
如果您在浏览器中选择查看源选项,则会看到与从命令行运行时完全相同的输出。
现在,如果希望此代码在浏览器中显示htmlspecialchars输出,则有两个选项。您可以发送一个内容类型的标头,其中标明输出应解释为纯文本:
$str = 'here is my "plaintext", OK?';
// tells the browser not to parse the code as HTML
header("content-type: text/plain");
echo $str . "<br>\n";
echo htmlspecialchars($str) . "<br>\n";
或者您可以通过多次调用htmlspecialchars对该字符串进行双重编码。尝试运行此代码,然后查看输出结果:
$str = 'here is my "plaintext", OK?';
echo $str . "<br>\n";
echo htmlspecialchars($str) . "<br>\n";
echo htmlspecialchars(htmlspecialchars($str)) . "<br>\n";
如果从命令行运行它,输出将如下所示:
here is my "plaintext", OK?<br>
here is my "plaintext", OK?<br>
here is my &quot;plaintext&quot;, OK?<br>
在浏览器中显示的代码如下:
here is my "plaintext", OK?
here is my "plaintext", OK?
here is my "plaintext", OK?