0

我有一个正则表达式,用于重新定义 php 文件中的常量,preg_match并使用 htmlspecialchars 筛选输入文件,例如

define('MEMBERSHIP', 'GOLD'); 

以下正则表达式有效

/define.*[&quote\']' . $constant . '[&quote;\'].*;/i

但是它匹配最后一个分号,在大多数情况下都有效,但在以下情况下失败,例如:

define("MEMBERSHIP", 'GOLD'); // membership subscription; empty means not in use.

注意最后一个分号,导致替换代码为

define("MEMBERSHIP", 'SILVER'); empty means not in use.

这破坏了代码。尝试了下面的正则表达式,但它不适用于带有双引号的人

/define.*[&quote;\']' . $constant . '[&quote;\'][^;]*;/i

知道如何解决这个问题吗?

4

2 回答 2

1

如果在?之后添加 a *,它将变得贪婪并占用尽可能少的字符。所以试试

/define.*?[&quote\']' . $constant . '[&quote;\'].*?;/i

看看它是否符合您的要求。

一般来说,.如果您实际上并不表示任何字符,则应避免使用 s 。

于 2012-12-11T11:54:04.457 回答
0

您可以使用反向引用匹配相应的引号:

'/define[^"\']*(["\'])' . $constant . '\1[^;]*;/i'

否则,您最后拥有的否定字符类绝对是要走的路。

于 2012-12-11T12:04:28.760 回答