比较简单 Preg_match_all 导致 502 Bad Gateway
relatively simple Preg_match_all causes 502 Bad Gateway
我有一个 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 switch 将换行符视为点(因为我想让它在多行中工作)和 x 以便于阅读(但删除 x 并不能解决问题)。
它适用于我拥有的大多数输入数据,但对于某些特定输入,它会在 nginx 服务器上导致 502 Bad gateway 错误,而日志中没有任何错误或异常。我正在使用 nginx + php-fpm (5.6.15-1+deb.sury.org~trusty+1),但同样发生在 php7.
这是导致 502 Bad gateway error PHP 的代码,您可以轻松检查它,非常简单,只需一个变量和正则表达式。
请确保您复制了内容1:1,其中包含所有空格、制表符等
非常奇怪的是,您几乎可以删除任何一行,甚至可以删除一个缩进(任何地方的任何几个空格)以使其正常工作。
我不知道这里出了什么问题,我能够创建这个单个文件来演示我的问题,但不知道如何解决它。
您的正则表达式包含 "tempers" 点模式的否定前瞻。但是,您未能为其添加结束分隔符,因此,它变成了 "heavy".
我建议将结束定界符 ([endif]
) 添加到先行检查中:
\[(if)\s+([^\]]*+)\]((?>(?!\[(?:end)?if\b).|(?R))*)\[endif\]
^^^^^^^^
见demo
或者,您甚至可以将经过锻炼的贪婪令牌展开为
\[(if)\s+([^\]]*+)\]((?>[^[]++(?:\[(?!(?:end)?if\b)[^[]*)*|(?R))*)\[endif\]
参见the regex demo(但是,如果[
可以跟在[if...]
之后,那将不起作用)。
此外,请注意您的正则表达式在 (if)
之后有一个 space 并且由于您使用的是 /x
修饰符,因此不考虑作为文字 space,但被忽略。这就是为什么我将其更改为 \s+
.
我有一个 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 switch 将换行符视为点(因为我想让它在多行中工作)和 x 以便于阅读(但删除 x 并不能解决问题)。
它适用于我拥有的大多数输入数据,但对于某些特定输入,它会在 nginx 服务器上导致 502 Bad gateway 错误,而日志中没有任何错误或异常。我正在使用 nginx + php-fpm (5.6.15-1+deb.sury.org~trusty+1),但同样发生在 php7.
这是导致 502 Bad gateway error PHP 的代码,您可以轻松检查它,非常简单,只需一个变量和正则表达式。
请确保您复制了内容1:1,其中包含所有空格、制表符等
非常奇怪的是,您几乎可以删除任何一行,甚至可以删除一个缩进(任何地方的任何几个空格)以使其正常工作。
我不知道这里出了什么问题,我能够创建这个单个文件来演示我的问题,但不知道如何解决它。
您的正则表达式包含 "tempers" 点模式的否定前瞻。但是,您未能为其添加结束分隔符,因此,它变成了 "heavy".
我建议将结束定界符 ([endif]
) 添加到先行检查中:
\[(if)\s+([^\]]*+)\]((?>(?!\[(?:end)?if\b).|(?R))*)\[endif\]
^^^^^^^^
见demo
或者,您甚至可以将经过锻炼的贪婪令牌展开为
\[(if)\s+([^\]]*+)\]((?>[^[]++(?:\[(?!(?:end)?if\b)[^[]*)*|(?R))*)\[endif\]
参见the regex demo(但是,如果[
可以跟在[if...]
之后,那将不起作用)。
此外,请注意您的正则表达式在 (if)
之后有一个 space 并且由于您使用的是 /x
修饰符,因此不考虑作为文字 space,但被忽略。这就是为什么我将其更改为 \s+
.