[英]PHP - REGEX - Match Length
我有這個正則表達式:
^((?:(?:\s*[a-zA-Z0-9]+)*)?)\s*function\s+([_a-zA-Z0-9]+)\s+\(\s*(.*)\s*\)\s*
匹配此字符串:
public function private ($var,Type $typed, $optional = 'option');
它有效,但在匹配這個時:
public function privateX ($var,Type $typed, $optional = 'option');
它失敗。
我注意到當函數名稱的長度超過6個字符時,它就不再匹配了。
這是完整的代碼:
$strA = 'public function 6Chars ($var,Type $typed, $optional = "option");';
$strB = 'public function MoreThan7 ($var,Type $typed, $optional = "option");';
preg_match('!^((?:(?:\s*[a-zA-Z0-9]+)*)?)\s*function\s+([_a-zA-Z0-9]+)\s+\(\s*(.*)\s*\)\s*!',$strA,$mA);
preg_match('!^((?:(?:\s*[a-zA-Z0-9]+)*)?)\s*function\s+([_a-zA-Z0-9]+)\s+\(\s*(.*)\s*\)\s*!',$strB,$mB);
print_r($mA);
print_r($mB);
我的問題非常簡單:為什么第二個字符串不匹配?
我無法在RegexBuddy中重現這一點; 兩個聲明都匹配。 但是,正則表達式引擎所需的步驟與每個字符的匹配加倍。 函數名稱為6個字符,需要大約100.000步的正則表達式引擎,7個字符200.000步,8個字符400.000步等。
也許正則表達式引擎在經過一定步驟后才會放棄?
占有量詞( ++
)通過減少正則表達式引擎必須經歷的可能排列來大幅減少所需的步數 - 無論函數名稱的長度如何,都會有50步。
!^((?:(?:\s*[a-zA-Z0-9]++)*)?)\s*function\s+([_a-zA-Z0-9]+)\s+\(\s*(.*)\s*\)\s*!
您在正則表達式中看到的災難性回溯的原因是:
(?:(?:\s*[a-zA-Z0-9]+)*)
您正在嵌套量詞,並且您已將空格設置為可選。 因此, ABC
可以匹配為ABC
, A
/ BC
, AB
/ C
或A
/ B
/ C
每個字符的排列數呈指數增長。 您進一步使整個組可選的(在使問題復雜化?
圍繞整個事情)。
你只需要啟用/multiline /m
標志,然后它將匹配我在下面確認測試的兩條線路。 干杯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.