问题
我正在解决的问题是,我正在处理的一些代码的过去的开发人员设置了变量,如 $_GET[name] 或有时像 $_GET['name']。为了使代码统一,我想让它们都像 $_GET['name']
尝试的解决方案
在自定义 DreamWeaver 脚本中,我使用了以下内容。
dreamweaver.setUpFindReplace({
searchString: "\$(_POST|_SESSION|_GET)\[([^\'][0-9a-zA-Z _]+?[^\'])\]",
replaceString: "$$1['$2']",
searchWhat: "document",
searchSource: true,
useRegularExpressions: true
});
dreamweaver.replaceAll();
额外的信息
当我从自定义脚本运行它时出现错误,但在“查找提示”(CTRL + F)中运行相同的“searchString”和“replaceString”时没有出现该错误。
查找提示将会很乐意地找到并替换它出现的实例。
在有人可能指出这一事实之前 - 是的,我可以运行“查找提示”并从那里执行,但我仍然必须运行自定义脚本来运行其他 20 个左右的查找和替换选项。
您是否有某处的示例最终结果?
当然可以。我有在 Regex 101 中使用的正则表达式 -https://regex101.com/r/bE9kN6/1
最后...
有人知道如何解决括号不匹配的问题吗?我尝试了一段时间,但找不到解决方案,因为没有括号不匹配的问题。
解决方案
感谢 Bob 解决了这个问题。Dreamweaver 使用 JS 正则表达式(我不认为它与 PHP 有什么不同,但事实证明一个是 POSIX,一个是 perl-regex [或类似的东西...]),并且文字需要用\\
not进行转义\
。
这产生了最终的、有效的功能;
dreamweaver.setUpFindReplace({
searchString: "\\$(_POST|_SESSION|_GET)\\[([^\'][0-9a-zA-Z _]+?[^\'])\\]",
replaceString: "$$1['$2']",
searchWhat: "document",
searchSource: true,
useRegularExpressions: true
});
dreamweaver.replaceAll();
答案1
您的转义有点不对。您似乎在使用 JavaScript,并且字符串文字的"\$(_POST|_SESSION|_GET)\[([^\'][0-9a-zA-Z _]+?[^\'])\]"
计算结果为$(_POST|_SESSION|_GET)[([^'][0-9a-zA-Z _]+?[^'])]
。
相反,您应该使用"\\$(_POST|_SESSION|_GET)\\[([^'][0-9a-zA-Z _]+?[^'])\\]"
,其计算结果为\$(_POST|_SESSION|_GET)\[([^'][0-9a-zA-Z _]+?[^'])\]
。
原因是,实际上有两个级别的解析正在进行,每个级别都有自己的转义规则。首先,您有 JavaScript 字符串文字,它允许转义诸如\n
换行符之类的内容。但是,无法识别的转义序列(例如)"\["
会被默默吞掉并产生[
。正则表达式引擎会看到[
,表示字符类的开始。
您希望正则表达式引擎接收模式中的文字反斜杠。为此,您必须首先生成一个包含文字反斜杠的 JS 字符串。这意味着您必须在字符串文字中转义反斜杠本身,因此"\\"
生成\
,例如"\\["
生成字符串\[
。这样,正则表达式引擎就会看到\[
,表示转义的(文字)括号。
另一件事是单引号根本不需要转义,因为它们在正则表达式中没有特殊含义,并且双引号字符串内的单引号被 JS 视为普通字符。
还有另一种选择,但我不确定 DreamWeaver 是否接受它。JavaScript 有一个特殊正则表达式文字语法,因此您不必先创建字符串。通过跳过额外的解析步骤,您实际上避免了双重转义的需要。JS 正则表达式文字的形式为/pattern/options
(正斜杠需要转义,但此模式中没有)。因此您的模式可以表示为/\$(_POST|_SESSION|_GET)\[([^'][0-9a-zA-Z _]+?[^'])\]/
。再次,单引号根本不需要转义。
如果 DreamWeaver 支持正则表达式文字语法,这实际上是首选选项。