2011-07-07 124 views
1

是否有正則表達式來檢查一個字符串是否是一個有效的PHP正則表達式?有效的正則表達式模式的PHP正則表達式

在我的應用程序的後臺,管理員定義了數據類型,他可以將模式定義爲正則表達式。例如/^[A-Z][a-zA-Z]+[a-z]$/和前臺,我使用此模式驗證用戶條目。 在我的代碼使用PHP preg_match功能

preg_match($pattern, $user_entries); 

第一個參數必須是有效的PHP正則表達式,我怎麼可以肯定的是$模式是因爲它有效的正則表達式在我的後臺辦公用戶entrie。

有什麼想法?

+0

一個警告有關允許的執行任意正則表達式:如果只有管理員可以定義正則表達式,並且管理員知道正則表達式的方式,那麼它應該沒問題。但請注意,正則表達式和數據的「正確」組合可能會導致災難性的回溯,從本質上阻止了您的應用程序。例如,正則表達式*。*。*。*。*。*。*。* ^'將使您的正則表達式引擎在超過幾個字符的任何字符串上保持*長*時間的繁忙(應用於> 590.000次迭代例如,「1111111111111111」)。 –

+0

更糟糕的是,如果正則表達式與'preg_replace'一起使用,則使用'/ e'修飾符替換將被評估爲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; 
} 

功能preg_match()返回false上的錯誤,並int

背景:我不知道正則表達式本身是否構成一個正則語法,即原則上是否可能用正則表達式驗證正則表達式。通用方法是開始解析並檢查是否發生錯誤,這是解決方法的作用。

0

從技術上講,任何表達式可以是一個有效的正則表達式...

所以,正則表達式的有效性將取決於你要尊重規則。

我想:

  1. 確定規則的正則表達式必須做
  2. 使用自己的preg_match,或substr一些組合驗證方式
相關問題