【问题标题】:Saving source code from HTML textarea to file将源代码从 HTML 文本区域保存到文件
【发布时间】:2012-11-23 22:15:11
【问题描述】:

我正在使用 PHP 从 HTML 表单的文本区域保存 C++ 代码。

问题是如果我的代码如下所示,

printf("%d\n");
printf("%d\n");

保存到文件中的代码是这样的:

printf(\"%d\\n\");\nprintf(\"%d\\n\");

我希望将原始代码保存在文件中。如果我使用,

$sourceCode = str_replace('\n',"\n", $sourceCode);
$sourceCode = str_replace('\"',"\"", $sourceCode);

结果如下(保存在文件中):

printf("%d\
");printf("%d\
");

很明显,替换源代码中的\n 会替换所有创建的HTML \n 以及用户作为输入(原始文本)提供的\n。唯一的区别是用户输入在\n之前多了一个\,即\\n

如何解决这个问题,只替换隐式转义字符,而用户自己编写的显式转义字符不会被更改?

【问题讨论】:

  • 你用来写入文件的 PHP 是什么?

标签: php html forms


【解决方案1】:

正如 KenB 所说,我们需要查看您用于处理表单输入的 PHP 代码。

处理表单输入

在我看来,addslashes 已用于表单输入。

  • 如果您在代码中这样做,不要。这不是处理表单输入的正确方法。相反,您应该在使用输入之前使用正确的函数(例如htmlspecialcharsmysqli_real_escape_string)对输入进行转义。 Read about addslashes.

  • 如果您使用的是旧版本的 PHP,其中 magic_quotes_gpc 默认处于启用状态,那么您应该修复它。 Read about 'Disabling Magic Quotes'.

去掉斜线

如果您无法控制添加斜杠的代码,则可以使用名为 stripslashes 的简单 PHP 函数将其删除。

$sourceCode = stripslashes($sourceCode);

Read about stripslashes.

了解转义序列

您的str_replace 代码显示对转义序列缺乏了解和/或对单引号和双引号缺乏了解。

在以下代码中,文字 \n 被换行符替换。使用双引号,PHP 将 \n 解释为转义序列而不是文字字符串。

$sourceCode = str_replace('\n',"\n", $sourceCode);

您想要的是将文字 \\n 替换为文字 \n。请注意,要指定文字反斜杠,它必须加倍;因此您会在下面看到三个反斜杠。

$sourceCode = str_replace('\\\n', '\n', $sourceCode);

虽然下一行完成了你想要的......

$sourceCode = str_replace('\"',"\"", $sourceCode);

...它可能写得不同。以下代码更易于阅读,无需转义文字 ",并且不需要 PHP 来解释字符串。

$sourceCode = str_replace('\"', '"', $sourceCode);

我已将上述代码作为 示例 来解释 PHP 如何解释转义序列,但不要使用它们。首先要避免添加斜杠或使用适当的功能剥离它们,如本答案的第一部分所述。

阅读有关escape sequencesquoting strings 的更多信息。

文字\n 行间

我不确定您要在两行之间添加文字 \n 做什么。我们需要查看您的代码。但是要在事后将其删除,您可以尝试以下操作

$sourceCode = str_replace(';\n', ";\n", $sourceCode);

当然,那么您可能需要更正其他 C++ 行尾序列。所以最好不要一开始就添加。

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 2012-12-31
    • 2018-07-13
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多