addcslashes
(PHP 4, PHP 5, PHP 7, PHP 8)
addcslashes — C 言語と同様にスラッシュで文字列をクォートする
説明
characters
パラメータに羅列された文字の前にバックスラッシュを付けた文字列を返します。
パラメータ
string
-
エスケープしたい文字列。
characters
-
エスケープの対象となる文字を並べたもの。
characters
が\n
,\r
等の文字を含んでいる場合、 C言語と同様の手法によりエスケープされます。 アスキーコードが32未満または126より大きい文字は、8進表現に変換されます。characters
引数の文字の列びを定義する際には、 範囲の最初と最後で指定する文字集合に含まれる文字の種類を把握するようにしてください。<?php
echo addcslashes('foo[ ]', 'A..z');
// 出力: \f\o\o\[ \]
// 全ての大文字と小文字はエスケープされます。
// ... しかし、[\]^_` もエスケープされてしまいます。
?><?php
echo addcslashes("zoo['.']", 'z..A');
// 出力: \zoo['\.']
?>0, a, b, f, n, r, t そして v といった文字をエスケープするときには注意しましょう。 変換結果はそれぞれ \0, \a, \b, \f, \n, \r, \t そして \v となりますが、 これらはすべて、C 言語では定義済みのエスケープシーケンスです。 その多くは C 言語に由来する他の言語でもエスケープシーケンスとして定義されており、 PHP も例外ではありません。つまり、
characters
にこれらの文字を定義した状態で addcslashes() を使って他の言語のコードを生成したときに、 期待通りの結果が得られない可能性があるということです。
戻り値
エスケープされた文字列を返します。
例
"\0..\37" のように characters
に範囲を指定可能です。この場合、アスキーコードが 0 から 31
の範囲の文字は全てエスケープされます。
例1 addcslashes() の例
<?php
$escaped = addcslashes($not_escaped, "\0..\37!@\177..\377");
?>
参考
- stripcslashes() - addcslashes でクォートされた文字列をアンクォートする
- stripslashes() - クォートされた文字列のクォート部分を取り除く
- addslashes() - 文字列をスラッシュでクォートする
- htmlspecialchars() - 特殊文字を HTML エンティティに変換する
- quotemeta() - メタ文字をクォートする
User Contributed Notes 3 notes
If you are using addcslashes() to encode text which is to later be decoded back to it's original form, you MUST specify the backslash (\) character in charlist!
Example:
<?php
$originaltext = 'This text does NOT contain \\n a new-line!';
$encoded = addcslashes($originaltext, '\\');
$decoded = stripcslashes($encoded);
//$decoded now contains a copy of $originaltext with perfect integrity
echo $decoded; //Display the sentence with it's literal \n intact
?>
If the '\\' was not specified in addcslashes(), any literal \n (or other C-style special character) sequences in $originaltext would pass through un-encoded, but then be decoded into control characters by stripcslashes() and the data would lose it's integrity through the encode-decode transaction.
addcslashes() treats NUL as a string terminator:
assert("any" === addcslashes("any\0body", "-"));
unless you order it backslashified:
assert("any\\000body" === addcslashes("any\0body", "\0"));
(Uncertain whether this should be declared a bug or simply that addcslashes() is not binary-safe, whatever that means.)
I have found the following to be much more appropriate code example:
<?php
$escaped = addcslashes($not_escaped, "\0..\37!@\@\177..\377");
?>
This will protect original, innocent backslashes from stripcslashes.