1

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とともに作成されたすべてのHTMLが置き換えられることは明らかです。\n唯一の違いは、ユーザーの入力の\前にが追加されていることです。\nつまり、です\\n

暗黙のエスケープ文字のみが置き換えられ、ユーザーが自分で作成した明示的なエスケープ文字は変更されないようにするには、どうすれば問題を解決できますか?

4

1 に答える 1

1

KenB が述べたように、フォーム入力を処理するために使用している PHP コードを確認する必要があります。

フォーム入力の処理

addslashesフォーム入力で使用されているように見えます。

  • コードでそれを行っている場合は、しないでください。これは、フォーム入力を処理する適切な方法ではありません。代わりに、正しい関数 (htmlspecialcharsまたは などmysqli_real_escape_string) を使用して、入力を使用する前にエスケープする必要があります。についてお読みくださいaddslashes

  • magic_quotes_gpcデフォルトでオンになっている古いバージョンの PHP を使用している場合は、それを修正する必要があります。「マジック クォートの無効化」についてお読みください

スラッシュを取り除く

スラッシュを追加しているコードを制御できない場合は、 という単純な PHP 関数を使用してスラッシュを削除できますstripslashes

$sourceCode = stripslashes($sourceCode);

についてお読みくださいstripslashes

エスケープ シーケンスについて

あなたのstr_replaceコードは、エスケープ シーケンスに関する理解の欠如、および/または単一引用符と二重引用符に関する理解の欠如を示しています。

次のコードでは、リテラル\nが改行に置き換えられています。二重引用符を使用すると、PHP は\nをリテラル文字列ではなくエスケープ シーケンスとして解釈します。

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

あなたが望むのは、リテラル\\nをリテラルに置き換えることです\n。リテラルのバックスラッシュを指定するには、二重にする必要があることに注意してください。したがって、以下に示す 3 つのバックスラッシュです。

$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 に答える