【发布时间】:2016-05-26 11:27:04
【问题描述】:
我有一个带有模式的 preg_match_all 函数:
preg_match_all(
'/\[(if) ([^\]]*)\]
((?:(?!\[if).|(?R))*?)
\[endif\]/sx',
$text,
$matches
);
我猜这是很简单的模式,它寻找语法 [if condition] sometext [endif],但它也支持嵌入 ifs f.e. [if condition1] aa [if condition2] bb [endif] [endif]。我使用 s 开关将换行符视为点(因为我想让它在多行中工作)和 x 以便于阅读(但删除 x 并不能解决问题)。
它适用于我拥有的大多数输入数据,但对于某些特定输入,它会在 nginx 服务器上导致 502 Bad gateway 错误,而日志中没有任何错误或异常。我正在使用 nginx + php-fpm (5.6.15-1+deb.sury.org~trusty+1),但 php7 也是如此。
这里是导致502 Bad gateway错误的PHP代码,你可以很容易的检查它,很简单,只是一个变量和正则表达式。
请确保您以 1:1 的比例复制内容,包括所有空格、制表符等。
非常奇怪的是,您几乎可以删除任何一行,甚至可以删除一个缩进(任何地方的任何几个空格)以使其正常工作。
我不知道这里出了什么问题,我能够创建这个文件来演示我的问题,但不知道如何解决它。
【问题讨论】:
-
我无法在 eval.in 上重现它:eval.in/577522
-
@jeroen 对,令人惊讶的是,它使用 php 运行良好,刚刚使用
php test.php检查运行,它按预期工作。仅当使用 php-fpm (nginx/1.8.0) 通过 nginx 打开文件时才会出现此问题 -
@WiktorStribiżew 您的解决方案有效,谢谢!
标签: php regex whitespace preg-match-all bad-gateway