29

文字列がPHPの正規表現または通常の文字列であるかどうかをテストする良い方法はありますか?

理想的には、true または false を返す、文字列を実行する関数を作成したいと考えています。

私は見ていたpreg_last_error()

<?php
preg_match('/[a-z]/', 'test');
var_dump(preg_last_error());
preg_match('invalid regex', 'test');
var_dump(preg_last_error());
?>

明らかに最初のものはエラーではなく、2番目のものはエラーです。しかし、両方の時間をpreg_last_error()返します。int 0

何か案は?

4

4 に答える 4

16

文字列が正規表現かどうかをテストする最も簡単な方法は次のとおりです。

if( preg_match("/^\/.+\/[a-z]*$/i",$regex))

これは、文字列が正規表現として意図されている可能性が高いかどうかを示します。ただし、そのチェックに合格しても正規表現ではない文字列が多数あります。エスケープされていない途中のスラッシュ、末尾の不明な修飾子、不一致の括弧などはすべて問題を引き起こす可能性があります。

0 が返される理由preg_last_errorは、「無効な正規表現」ではないためです。

  • PREG_INTERNAL_ERROR (内部エラー)
  • PREG_BACKTRACK_LIMIT_ERROR (過度にバックトラッキングを強制)
  • PREG_RECURSION_LIMIT_ERROR (過度の再帰)
  • PREG_BAD_UTF8_ERROR (不適切なフォーマットの UTF-8)
  • PREG_BAD_UTF8_OFFSET_ERROR (UTF-8 文字の途中までのオフセット)
于 2012-05-28T00:57:23.653 に答える
10

正規表現が PHP で有効かどうかをテストする唯一の簡単な方法は、正規表現を使用して警告がスローされるかどうかを確認することです。

ini_set('track_errors', 'on');
$php_errormsg = '';
@preg_match('/[blah/', '');
if($php_errormsg) echo 'regex is invalid';

ただし、任意のユーザー入力を正規表現として使用することはお勧めできません。以前は、PCRE エンジンにセキュリティ ホール (バッファ オーバーフロー => リモート コード実行) があり、コンパイル/実行に大量の CPU/メモリを必要とする、特別に細工された長い正規表現を作成できる可能性がありました。

于 2012-05-28T00:59:53.720 に答える
9

なぜ...別の正規表現を使用しないのですか? 3行、@クラッジなどはありません:

// Test this string
$str = "/^[A-Za-z ]+$/";

// Compare it to a regex pattern that simulates any regex
$regex = "/^\/[\s\S]+\/$/";

// Will it blend?
echo (preg_match($regex, $str) ? "TRUE" : "FALSE");

または、関数形式では、さらにきれいです:

public static function isRegex($str0) {
    $regex = "/^\/[\s\S]+\/$/";
    return preg_match($regex, $str0);
}

これは有効性をテストしません。しかし、それは問題のように見え、Is there a good way of test if a string is a regex or normal string in PHP?そうします。

于 2013-04-19T05:52:55.250 に答える