正则表达式匹配PHP代码中的第一个半冒号

时间:2012-12-11 11:15:00

标签: php regex

我有一个正则表达式,用于使用preg_match在php文件中重新定义一个常量,并使用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

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

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

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

一般来说,如果您实际上不是指任何字符,则应避免使用.

答案 1 :(得分:0)

您可以使用backreference

匹配相应的引号
'/define[^"\']*(["\'])' . $constant . '\1[^;]*;/i'

否则,你最终得到的否定角色类绝对是你要走的路。