2015-10-30 61 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((!!。* + @)。+) '。 –

相关问题