我有互聯網上做工精細正則表達式和Regex101正則表達式與服務器,但在XAMPP本地主機不能正常工作多修改工作
我用下面的PHP代碼來測試它在本地主機
<?php
$regex = "/(?:دفتر)(?:.*?)\:(?:.*?|\n)(^(?!.*\@).+)/mu";
preg_match_all($regex,$str, $arr);
print_r($arr);
?>
但是當在XAMPP本地主機上運行它返回的空數組,這個代碼有什麼問題,我該如何修復它
我有互聯網上做工精細正則表達式和Regex101正則表達式與服務器,但在XAMPP本地主機不能正常工作多修改工作
我用下面的PHP代碼來測試它在本地主機
<?php
$regex = "/(?:دفتر)(?:.*?)\:(?:.*?|\n)(^(?!.*\@).+)/mu";
preg_match_all($regex,$str, $arr);
print_r($arr);
?>
但是當在XAMPP本地主機上運行它返回的空數組,這個代碼有什麼問題,我該如何修復它
您需要考慮換行符序列的不同變體。在Windows中,CR + LF在Linux中是LF,在MacOS中是CR。
在PCRE中,您有一個非常方便的速記類\R
匹配任何換行序列。
因此,使用
'/(?:دفتر)(?:[^:\n]*):.*\R((?!.*@).+)/mu'
而且不要忘了/u
修改,這將迫使正則表達式引擎對待這兩個模式,輸入字符串爲UTF8字符串。
請注意,/U
修飾符與/u
不同。 /U
只交換貪婪。
/%(.*?)%/U = /%(.*)%/
/%(.*?)%/ = /%(.*)%/U
非常感謝,最好解釋問題 – MOB
請注意,我優化了你的正則表達式。取反的字符類'[^:\ n] *'將匹配除':'或換行符以外的0個或更多字符,並且比'。*?'更有效。另外,'(?:。*?| \ n)'沒有什麼意義,交替涉及回溯,如果可能應該避免 - 我將它改爲。* \ R,它是* linear *。您可以用'。* + @':'(?:دفتر)(?:[^:\ n] *):。* \ R((!!。* + @)。+) '。 –
嘗試'var_dump($ regex); var_dump($ str);'也是。 – hjpotter92
我想你忘了'/ u'修飾符 - 請顯示'$ regex'聲明。 –
我嘗試了他們,並沒有任何不同與在線正則表達式編輯器 – MOB