1

I am saving C++ code from a textarea of an HTML form using PHP.

The problem is if my code is like below,

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

the code that is saved to the file is like this:

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

I want the original code to be saved in the file. If I use,

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

the result is like below (saved in the file):

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

It is clear that replacing \n in the source code replaces all the HTML created \n along with the \n that user gave as input (the original text). The only difference is user's input has an additional \ before the \n, that is \\n.

How can I resolve the problem such that only the implicit escape characters will be replaced, but the explicit escape characters, that the user wrote himself, will not be changed?

4

1 回答 1

1

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

处理表单输入

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

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

  • 如果您使用的是旧版本的 PHP,magic_quotes_gpc默认情况下是打开的,那么您应该修复它。阅读有关“禁用魔术行情”的信息

剥离斜线

如果您无法控制添加斜杠的代码,则可以使用名为stripslashes.

$sourceCode = stripslashes($sourceCode);

阅读有关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 如何解释转义序列,但不要使用它们。要么首先避免添加斜杠,要么使用适当的功能剥离它们,如本答案的第一部分所述。

阅读有关转义序列引用字符串的更多信息。

\n间字

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

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

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

于 2012-12-03T05:52:20.650 回答