2011-07-07 20 views
1

文字列が有効なPHP正規表現であるかどうかを確認する正規表現はありますか?有効なregexpパターンのPHP正規表現

私のアプリケーションのバックオフィスでは、管理者がデータ型を定義し、パターンを正規表現として定義できます。たとえば/^[A-Z][a-zA-Z]+[a-z]$/とフロントオフィスでは、このパターンを使用してユーザー入力を検証します。 私のコードでは、私はPHP preg_match機能

preg_match($pattern, $user_entries); 

を使用する最初の引数は、どのように私は$パターンが私のバックオフィスでのユーザーentrie以来の有効な正規表現であることを確認することができ、有効なPHPの正規表現でなければなりません。

+0

注意点を検証するために、独自のpreg_match、またはsubstrのいくつかの組み合わせを使用して操作を行う必要があり、ルールを識別する任意のregexes:adminsだけがregexesを定義でき、あなたの管理者がregexesの周りに自分の道を知っているなら、それはうまくいくはずです。しかし、正規表現とデータの「正しい」組み合わせが壊滅的なバックトラッキングを引き起こし、基本的にアプリケーションをブロックすることに注意してください。たとえば、正規表現 '。*。*。*。*。*。*。* ^'は、数文字より長い文字列(正規表現に適用される場合は590.000回を超える文字列)例えば、「1111111111111111」)。 –

+0

'/ e'修飾子を使用すると、regexが' preg_replace'とともに使用された場合、置換はPHPコードとして評価されます。 – ThiefMaster

答えて

3

実行して警告を受け取ります。

$track_errors = ini_get('track_errors'); 
ini_set('track_errors', 'on'); 
$php_errormsg = ''; 
@preg_match($regex, 'dummy'); 
$error = $php_errormsg; 
ini_set('track_errors', $track_errors); 
if($error) { 
    // do something. $error contains the PHP warning thrown by the regex 
} 

あなただけのあなたは、単にpreg_match($regex, 'dummy') === falseを使用することができます正規表現が失敗したかどうかを知りたいかない場合 - しかし、あなたにエラーメッセージを与えることはありませんこと。回避策として

1

、あなただけ試してみて、使用して正規表現をし、エラーが発生するかどうかを確認できます。

function is_regex($pattern) 
{ 
    return @preg_match($pattern, "") !== false; 
} 

エラーなしで実行したときにエラーにfalseを返し、intpreg_match()機能を。

背景:正規表現自体が規則的な文法を形成するかどうか、つまり正規表現で正規表現を検証することも原理的に可能かどうかはわかりません。一般的なアプローチは、解析が始まり、エラーが発生したかどうかをチェックすることです。これが回避策の仕組みです。

0

任意の式が有効な正規表現することができ、技術的...だから

、正規表現の妥当性は、あなたが尊敬するルールに依存します。

私が希望:

  1. は、あなたの正規表現は、の実行を可能にすることについて
  2. パターン