我有互联网上做工精细正则表达式和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