preg_last_error

関数の概要

preg_last_error 関数は、直前に実行された正規表現関数内で発生したエラーの内容を取得するためのPHP関数です。正規表現に問題があった場合、そのエラーコードを返し、どのような問題が起きたのかを調べることができます。特に preg_matchpreg_replace と組み合わせて使うことで、エラー処理やデバッグが簡単になります。

パラメータの説明

  • preg_last_error はパラメータを必要としません。呼び出すだけで最新の正規表現エラーコードを返します。

戻り値

この関数は整数のエラーコードを返します。返されるコードは以下のいずれかです:

  • PREG_NO_ERROR (0) – エラーなし
  • PREG_INTERNAL_ERROR (1) – 内部エラー
  • PREG_BACKTRACK_LIMIT_ERROR (2) – バックトラックの制限超過
  • PREG_RECURSION_LIMIT_ERROR (3) – 再帰の制限超過
  • PREG_BAD_UTF8_ERROR (4) – UTF-8エンコーディングエラー
  • PREG_BAD_UTF8_OFFSET_ERROR (5) – 不正なUTF-8オフセット
  • PREG_JIT_STACKLIMIT_ERROR (6) – JITスタック制限エラー(PHP 7.0以降)

使用例

基本的な使い方

<?php
preg_match('/php[/', 'php version');
// 不正な正規表現(スラッシュのエスケープ漏れ)

$error = preg_last_error();

if ($error !== PREG_NO_ERROR) {
    echo "正規表現エラーが発生しました。エラーコード: " . $error;
} else {
    echo "エラーなし";
}
?>

この例では、正規表現のパターンが不正であるためエラーが発生します。preg_last_error を使ってエラーの有無を判定し、エラーコードを表示しています。

エラー内容をわかりやすく表示する例

<?php
function getPregErrorMessage() {
    $error = preg_last_error();
    switch ($error) {
        case PREG_NO_ERROR:
            return 'エラーなし';
        case PREG_INTERNAL_ERROR:
            return '内部エラー';
        case PREG_BACKTRACK_LIMIT_ERROR:
            return 'バックトラック制限超過';
        case PREG_RECURSION_LIMIT_ERROR:
            return '再帰制限超過';
        case PREG_BAD_UTF8_ERROR:
            return '無効なUTF-8文字列';
        case PREG_BAD_UTF8_OFFSET_ERROR:
            return '無効なUTF-8オフセット';
        case PREG_JIT_STACKLIMIT_ERROR:
            return 'JITスタック制限エラー';
        default:
            return '不明なエラー';
    }
}

preg_match('/(abc/', 'abcdef'); // パターンエラー
echo getPregErrorMessage();
?>

このコードはエラーコードを分かりやすいメッセージに変換しています。初心者でもどんなエラーか理解しやすくなります。

実務で役立つパターンマッチ成功判定+エラー処理

<?php
$pattern = '/d+/';
$subject = 'abc123def';

if (preg_match($pattern, $subject, $matches)) {
    echo '数字が見つかりました: ' . $matches[0];
} else {
    $error = preg_last_error();
    if ($error !== PREG_NO_ERROR) {
        echo '正規表現エラー発生(コード: ' . $error . ')';
    } else {
        echo 'マッチしませんでした';
    }
}
?>

ここではマッチ結果の判定に加えて、マッチ失敗時に正規表現エラーもチェックしています。これにより、実際にパターンが間違っていないかどうかも見極められます。

関連する関数

  • preg_match
  • preg_replace
  • preg_match_all
  • preg_split

まとめ

preg_last_error はPHPの正規表現関数でエラーが発生したかどうかを簡単に確認できる便利な関数です。複雑な正規表現を使う際や、ユーザー入力を元に正規表現を作成する場合などに特に役立ちます。エラーコードをチェックし適切に処理することで、バグの発見や不具合の原因調査がしやすくなります。初心者から実務者まで、正規表現を安全に扱うために必ず覚えておきたい関数のひとつです。