2015-10-30 64 views
2

我有互聯網上做工精細正則表達式和Regex101正則表達式與服務器,但在XAMPP本地主機不能正常工作多修改工作

我用下面的PHP代碼來測試它在本地主機

<?php 
$regex = "/(?:دفتر)(?:.*?)\:(?:.*?|\n)(^(?!.*\@).+)/mu"; 
preg_match_all($regex,$str, $arr); 
print_r($arr); 
?> 

但是當在XAMPP本地主機上運行它返回的空數組,這個代碼有什麼問題,我該如何修復它

+0

嘗試'var_dump($ regex); var_dump($ str);'也是。 – hjpotter92

+1

我想你忘了'/ u'修飾符 - 請顯示'$ regex'聲明。 –

+0

我嘗試了他們,並沒有任何不同與在線正則表達式編輯器 – MOB

回答

1

您需要考慮換行符序列的不同變體。在Windows中,CR + LF在Linux中是LF,在MacOS中是CR。

在PCRE中,您有一個非常方便的速記類\R匹配任何換行序列

因此,使用

'/(?:دفتر)(?:[^:\n]*):.*\R((?!.*@).+)/mu' 

而且不要忘了/u修改,這將迫使正則表達式引擎對待這兩個模式,輸入字符串爲UTF8字符串。

請注意,/U修飾符與/u不同。 /U只交換貪婪。

/%(.*?)%/U = /%(.*)%/ 
/%(.*?)%/ = /%(.*)%/U 
+1

非常感謝,最好解釋問題 – MOB

+0

請注意,我優化了你的正則表達式。取反的字符類'[^:\ n] *'將匹配除':'或換行符以外的0個或更多字符,並且比'。*?'更有效。另外,'(?:。*?| \ n)'沒有什麼意義,交替涉及回溯,如果可能應該避免 - 我將它改爲。* \ R,它是* linear *。您可以用'。* + @':'(?:دفتر)(?:[^:\ n] *):。* \ R((!!。* + @)。+) '。 –

相關問題