PHPのaddcslashes関数の使い方!特定の文字をエスケープする

PHPのaddcslashes関数は、文字列内の指定した文字(または文字範囲)の前にバックスラッシュ(\)を追加してエスケープするために使用されます。

これは、特定の文字が特殊な意味を持つコンテキスト(例: 正規表現パターン、JavaScript文字列、SQLクエリなど)で、それらの文字をリテラル(文字通り)として扱いたい場合に非常に便利です。
addslashesがシングルクォート、ダブルクォート、バックスラッシュ、NULL文字といった限られた文字しかエスケープしないのに対し、addcslashesはより柔軟に、任意の文字や文字範囲を指定してエスケープできます。

この記事では、addcslashes関数の基本的な使い方、引数、戻り値、主要な使用例、そして使用する際の重要な注意点について解説します。

addcslashes関数の基本的な構文

addcslashes関数の基本的な構文は以下の通りです。

string addcslashes(string $string, string $characters): string
  • $string: 必須。エスケープ処理を施したい元の文字列です。
  • $characters: 必須。エスケープしたい文字、または文字の範囲を指定する文字列です。

第1引数(元の文字列)

  • 必須です。
  • エスケープ処理の対象となる文字列です。

第2引数(エスケープ対象の文字/範囲)

  • 必須です。
  • エスケープしたい特定の文字を文字列として指定します。例: '%_
  • 文字の範囲を指定できます。例: 'A..Z'(大文字AからZ)、'a..z'(小文字aからz)、'0..9'(数字0から9)。
  • バックスラッシュ(\)自身をエスケープしたい場合は、'\' と指定する必要があります(単なる'では\はエスケープされない)。
  • \0から\37までの文字は自動的にC言語形式のエスケープシーケンスに変換されます。

戻り値

エスケープされた新しい文字列が返されます。

重要な点:
* $characters引数では、文字の範囲を指定できます。例えば、'A..Z'と指定すると、大文字のAからZまでのすべての文字がエスケープされます。
* ASCII値が0から31までの文字は、\0(NULL文字)、\n(改行)、\t(タブ)のようにC言語形式でエスケープされます。それ以外の文字は \xNN(NNは16進数)または \u{NNNN}(NNNNは16進数、PHP 7.0以降)の形式でエスケープされます。

addcslashes関数を使ってみる

addcslashes関数を使用して、動作を確認してみます。

例1:特定の文字をエスケープする

文字列内の特定の文字の前にバックスラッシュを追加します。

<?php
$str = "Hello, World!";
$escapedStr = addcslashes($str, 'eo'); // 'e' と 'o' をエスケープ

echo $escapedStr . PHP_EOL;
// 出力: H\ell\o, W\orld!

$str変数にHello, World!という文字列を格納しています。
次の処理で、addcslashes関数を使ってエスケープしています。

第1引数にエスケープしたい文字列変数、第2引数にエスケープする文字を指定しています。
結果を確認すると、$str内のeoの前にバックスラッシュが追加されています。

例2:文字の範囲を指定してエスケープする

指定した文字範囲内のすべての文字をエスケープします。

<?php
$text = "My_Product_ID_123";
$escapedText = addcslashes($text, 'A..Z0..9_'); // 大文字、数字、アンダースコアをエスケープ

echo $escapedText . PHP_EOL;
// 出力: M\_Product\_ID\_123

次はaddcslashes関数の第2引数に「英語大文字と数値、アンダーバー」を指定しています。

これで$text変数内の大文字(M, P, I, D)、数字(1, 2, 3)、アンダースコア(_)がエスケープされます。
正規表現パターンの一部として安全に文字列を使いたい場合などに役立ちます。

例3:NULL文字や改行文字をエスケープする

ASCII値が小さい特殊文字もエスケープできます。

<?php
$data = "Line1\nLine2\0End"; // \n は改行、\0 はNULL文字
// ASCII値が0から31までの制御文字をエスケープ (改行 \n はASCII 10、NULL \0 はASCII 0)
$escapedData = addcslashes($data, "\0..\37");

echo $escapedData . PHP_EOL;
// 出力: Line1\nLine2\000End
// 説明:
// \n (改行コード) は、\n (C言語形式) としてエスケープされます。
// \0 (NULL文字) は、\000 (オクタル形式) としてエスケープされます。
// addcslashes関数は、これらの制御文字をC言語形式またはオクタル形式でエスケープします。

\nは改行コードを、\0はNULL文字をそれぞれ表し、addcslashes関数によって、それぞれ\n\000というエスケープシーケンスとして出力されます。
\0..\37はASCIIコードで0から31までの文字範囲を指定しています。

例4:バックスラッシュ自身をエスケープする

$引数内でバックスラッシュをエスケープ対象として指定する場合は、バックスラッシュを二重にする必要があります。

<?php
$path = "C:\Users\Documents";
$escapedPath = addcslashes($path, '\\'); // バックスラッシュ自身をエスケープ
// または $escapedPath = addcslashes($path, "\x5C"); // 16進数で指定

echo $escapedPath . PHP_EOL;
// 出力: C:\\Users\\Documents

$path変数に入っているバックスラッシュをエスケープするために、addcslashes関数にバックスラッシュを二つ指定しました。
これにより、パス文字列をJavaScriptの文字列リテラルとして安全に埋め込む際などに便利です。

addcslashes関数を使う時の注意点

addcslashes関数を使う時の注意点です。

$characters引数の記述

$引数内のバックスラッシュ(\)、シングルクォート(')、ダブルクォート(")は、PHPの文字列リテラルのルールに従って適切にエスケープする必要があります。
* バックスラッシュ(\)自体をエスケープ対象に含めるには、'\\' または "\x5C" のように指定します。
* シングルクォートで囲んだ$引数の中にシングルクォートを含めたい場合は、'\''とエスケープします。

二重エスケープに注意

addcslashes関数は指定した文字をエスケープしますが、すでにエスケープされている文字をさらにエスケープすることはしません。
ただし、$引数にエスケープ文字自身を含めることで、エスケープ文字がさらにエスケープされる場合があります。

可逆ではない場合がある

stripslashesaddslashesで追加されたバックスラッシュを削除できます。
また、stripcslashesaddcslashesが生成したC言語形式のエスケープシーケンス(\n, \t, \xNNなど)を元の文字に戻すことができます。

ただし、\xNN形式でエスケープされた文字が、元の文字が何かを知らずに復元されるという特性を理解しておく必要があります。

文字エンコーディング

addcslashesはバイト単位で動作し、マルチバイト文字エンコーディング(UTF-8など)を認識しません。
マルチバイト文字を含む文字列に対して特定の文字をエスケープしたい場合、意図しない結果になる可能性があります。

マルチバイト文字列を安全に扱う場合は、mb_ereg_replacepreg_replaceといった正規表現関数をpreg_quoteと組み合わせて使用する方が安全です。

addcslashesとaddslashesの違い

関数 エスケープ対象の文字 特徴 主な用途
addcslashes 指定した任意の文字または文字範囲**。ASCII値0-31はC形式エスケープシーケンスに。 非常に柔軟にエスケープ対象を指定できる。マルチバイト文字には非対応。 正規表現パターン、JavaScript文字列、C言語形式のエスケープが必要な場合。より高度な制御。
addslashes シングルクォート (')、ダブルクォート (")、バックスラッシュ (\)、NULL文字 (\0) のみ。 SQLクエリ向けに設計されており、安全性の確保には限定的。マルチバイト文字には非対応。 主にSQLクエリで文字列リテラルを安全にするため(ただし、プリペアドステートメントが推奨)。

使い分けの目安 

  • addcslashes: 特定の文字や文字範囲を厳密にエスケープしたい場合(特に正規表現パターンやJavaScriptコードに文字列を埋め込む場合)。
  • addslashes: SQLクエリに文字列リテラルを埋め込むための簡単なエスケープ(ただし、SQLインジェクション対策にはプリペアドステートメントが最も推奨されます)。

まとめ

PHPの addcslashes関数は、文字列内の指定した任意の文字や文字範囲の前にバックスラッシュを追加してエスケープするための、非常に柔軟なツールです。
正規表現パターン、JavaScriptコード、あるいはC言語形式のエスケープが必要な特殊なコンテキストで文字列を安全に扱いたい場合に役立ちます。

$characters引数の適切な指定方法、バックスラッシュ自身のエスケープ、マルチバイト文字への非対応といった重要な注意点を理解して使用することが不可欠です。
これらのポイントを踏まえ、addcslashes関数を効果的に活用し、PHPアプリケーションにおける文字列のエスケープ処理をより細かく制御しましょう。

PHP

コメント