2017-05-18 17 views
2

免責聲明:我不需要另一個更好沒有重置組的正則表達式。我需要了解爲什麼輸出不同PHP 5PHP 7對分支重置組的反向引用

問題:我試圖使用分支重置組來匹配使用PHP的字符串,該字符串由不同分隔符分隔的幾組數字組成。

$string = '12-34-56-78'; 
$pattern = '/^\d{2}(?|(---)|(-)|(\.)|(\:))\d{2}\1\d{2}\1\d{2}$/'; 
$matches = preg_match($pattern, $string) === 1; 
var_dump($matches); 

不幸it works onlyPHP < 7。我也檢查了libpcre的版本,這不是問題的根源。 libpcre的相同版本針對不同的PHP版本返回不同的結果。

我無法找到任何關於PHP 7中發生了什麼變化的原因。

問題:爲什麼輸出不同PHP 5PHP 7?這是PHP 7的預期行爲嗎?

更新:似乎是bug

+0

您不需要在此處重置任何分支,因爲您需要引用整個組值。僅僅是['^ \ d {2}(--- | [ - .:])\ d {2} \ 1 \ d {2} \ 1 \ d {2} $'](https:// regex101。 com/r/oqj4Ux/1)將在每個版本中運行。 –

+0

@WiktorStribiżew再次感謝你。我知道我可以使用另一個'正則表達式'。但這不是我所問的。 – Kolyunya

+0

我覺得我們可以把它減少到'$ string =' - '; $ pattern ='/ ^(?|(---)|( - )\ 1)/';'並觀察相同的行爲。 –

回答

2

你確定preg_match返回0而不是假嗎?

編輯

仍然不知道爲什麼,但反轉(-)(---)解決的問題:

/^\d{2}(?|(-)|(---)|(\.)|(\:))\d{2}\1\d{2}\1\d{2}$/

Demo

編輯2

在PHP 7中,似乎只有第一個子模式有效。正則表達式也將falsy用下面的代碼:

$string = '12.34.56.78'; 
$string = '12:34:56:78'; 
$string = '12---34---56---78'; 

也許PCRE錯誤,因爲分支復位synatx似乎是正確的我。

+1

但它不是POSIX,它是PCRE。 – Kolyunya

+0

我的錯誤。改變。 –

+0

好問題。我查過了,是的,它返回'0'。更新了代碼片段的鏈接。 – Kolyunya