如何编写正则表达式为含多层括号的htmlspecialchars添加空字符串回退
问题描述
要修复向htmlspecialchars函数传递null变量导致的错误,需要给函数参数添加空字符串回退 ?? ''。但现有正则仅能匹配单层括号的函数调用,现需编写可匹配多层嵌套括号的htmlspecialchars调用的正则,在函数自身的最后一个括号前插入 ?? ''。
输入示例:
htmlspecialchars($var)?>" /> htmlspecialchars(date('m/d/Y'))?>" /></td> htmlspecialchars(json_encode($config))?>" /> htmlspecialchars(addslashes(get_office_name($office_id))) . "'); ";
期望输出:
htmlspecialchars($var ?? '')?>" /> htmlspecialchars(date('m/d/Y') ?? '')?>" /></td> htmlspecialchars(json_encode($config) ?? '')?>" /> htmlspecialchars(addslashes(get_office_name($office_id)) ?? '') . "'); ";
正则表达式及替换方案
使用支持递归匹配的正则即可处理多层嵌套括号的场景,具体如下:
正则表达式
/(htmlspecialchars\()((?:[^()]|(?R))*?)(\))/
替换模板
$1$2 ?? ''$3
正则逻辑说明
htmlspecialchars\():精准匹配htmlspecialchars(的函数起始部分((?:[^()]|(?R))*?):核心递归匹配段,负责捕获括号内所有内容(含嵌套括号):[^()]:匹配非括号的普通字符(?R):递归调用整个正则,处理嵌套的括号结构*?:非贪婪匹配,确保仅匹配当前htmlspecialchars函数的结束括号
(\)):匹配htmlspecialchars函数的结束括号
替换时将捕获的起始段、括号内内容、结束段重新拼接,中间插入 ?? '',就能实现需求。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

