我正在使用PHP从HTML表单的textarea中保存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
。
如何解决问题,只会替换隐式转义字符,但用户自己编写的显式转义字符不会被更改?
答案 0 :(得分:1)
如KenB所述,我们需要查看用于处理表单输入的PHP代码。
在我看来,addslashes
已在表单输入中使用。
如果您在代码中执行此操作,则不要。这不是处理表单输入的正确方法。相反,您应该在使用之前使用正确的函数(例如htmlspecialchars
或mysqli_real_escape_string
)来转义输入。 Read about addslashes
如果您使用的是默认启用magic_quotes_gpc
的旧版PHP,那么您应该解决这个问题。 Read about 'Disabling Magic Quotes'
如果您无法控制添加斜杠的代码,则可以使用名为stripslashes
的简单PHP函数删除它们。
$sourceCode = stripslashes($sourceCode);
您的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 sequences和quoting strings。
\n
行之间我不知道你在做什么来在行之间添加文字\n
。我们需要查看您的代码。但要在事后删除它,您可以尝试以下
$sourceCode = str_replace(';\n', ";\n", $sourceCode);
当然,您可能需要更正其他C ++行尾序列。所以最好不要在第一时间添加它。