我有一个正则表达式,用于使用preg_match
在php文件中重新定义一个常量,并使用htmlspecialchars筛选输入文件
例如
define('MEMBERSHIP', 'GOLD');
以下正则表达式
/define.*["e\']' . $constant . '["e;\'].*;/i
然而它匹配最后一个半冒号,在大多数情况下都有效,但在如下情况下失败 例如:
define("MEMBERSHIP", 'GOLD'); // membership subscription; empty means not in use.
注意最后一个分号,导致替换代码为
define("MEMBERSHIP", 'SILVER'); empty means not in use.
打破了代码。尝试了下面的正则表达式,但它不适用于双引号的人
/define.*["e;\']' . $constant . '["e;\'][^;]*;/i
任何想法如何解决这个问题?
答案 0 :(得分:1)
如果您在?
之后添加*
,它将变得贪婪并占用尽可能少的字符。所以试试
/define.*?["e\']' . $constant . '["e;\'].*?;/i
看看它是否符合您的要求。
一般来说,如果您实际上不是指任何字符,则应避免使用.
。
答案 1 :(得分:0)
您可以使用backreference:
匹配相应的引号'/define[^"\']*(["\'])' . $constant . '\1[^;]*;/i'
否则,你最终得到的否定角色类绝对是你要走的路。