带有多行修饰符的正则表达式在服务器上工作但在 xampp localhost 上不起作用
regex with multiline modifier work on server but not work on xampp localhost
我有一个在互联网上运行良好的正则表达式 Regex101
我使用下面的 PHP 代码在本地主机中测试它
<?php
$regex = "/(?:دفتر)(?:.*?)\:(?:.*?|\n)(^(?!.*\@).+)/mu";
preg_match_all($regex,$str, $arr);
print_r($arr);
?>
但是当 运行 它在 XAMPP 本地主机上时它 return 的空数组,这段代码有什么问题,我该如何修复它
您需要考虑换行符序列的不同变体。在Windows中为CR+LF,在Linux中为LF,在MacOS中为CR。
在 PCRE 中,您有一个非常方便的 shorthand class \R
可以匹配 任何换行序列 .
所以,使用
'/(?:دفتر)(?:[^:\n]*):.*\R((?!.*@).+)/mu'
并且不要忘记 /u
修饰符,它会强制正则表达式引擎将模式和输入字符串都视为 UTF8 字符串。
请注意 /U
修饰符与 /u
不同。 /U
只交换贪婪。
/%(.*?)%/U = /%(.*)%/
/%(.*?)%/ = /%(.*)%/U
我有一个在互联网上运行良好的正则表达式 Regex101
我使用下面的 PHP 代码在本地主机中测试它
<?php
$regex = "/(?:دفتر)(?:.*?)\:(?:.*?|\n)(^(?!.*\@).+)/mu";
preg_match_all($regex,$str, $arr);
print_r($arr);
?>
但是当 运行 它在 XAMPP 本地主机上时它 return 的空数组,这段代码有什么问题,我该如何修复它
您需要考虑换行符序列的不同变体。在Windows中为CR+LF,在Linux中为LF,在MacOS中为CR。
在 PCRE 中,您有一个非常方便的 shorthand class \R
可以匹配 任何换行序列 .
所以,使用
'/(?:دفتر)(?:[^:\n]*):.*\R((?!.*@).+)/mu'
并且不要忘记 /u
修饰符,它会强制正则表达式引擎将模式和输入字符串都视为 UTF8 字符串。
请注意 /U
修饰符与 /u
不同。 /U
只交换贪婪。
/%(.*?)%/U = /%(.*)%/
/%(.*?)%/ = /%(.*)%/U