Dreamweaver Regex - 正则表达式中不匹配)

Dreamweaver Regex - 正则表达式中不匹配)

问题

我正在解决的问题是,我正在处理的一些代码的过去的开发人员设置了变量,如 $_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 支持正则表达式文字语法,这实际上是首选选项。

相关内容