如果您只想检查标记,那么正如其他人所建议的那样,PHP 标记器可能是一个不错的选择。
如果您想做的是以可靠的方式自动更改源代码,我不确定这会对您有所帮助。您将如何重新生成修改后的源文本?
另一种方法是使用program transformation 引擎。这样的引擎可以将源文本解析为抽象语法树,捕获程序的结构(以及所有标记的有效内容),并允许使用可靠的模式匹配/转换来搜索和转换这些 AST。要做到这一点,您需要一个能够可靠解析 PHP 的引擎,
并且可以从更改的 AST 中重现可编译的源文本。
我们的DMS Software Reengineering Toolkit就是这样一个程序转换系统,它有一个强大的PHP Front End,可以准确地处理PHP5,将结果解析、转换和漂亮地打印回文本。 (使 PHP 解析器正确困难,因为该语言的文档记录很差)。因为前端可以准确地提取 HTML 和 PHP 代码,所以不需要 分离出文本;它们将停在独特的树节点中清晰可辨的位置。
要将所有回显的字符串从小写变为大写,您可以使用 DMS 解析 PHP,然后应用以下转换规则:
rule uppercase_echoed_string(s: STRING): statement -> statement
= "echo \s;" -> "echo \uppercase\(\s\);".
此规则是用 DMS 的规则规范语言 (RSL) 编写的,这显然不是 PHP。引号里面的东西是PHP代码;这些是 meta 引号包裹在被操作的编程语言的文本周围。 \ 字符是元转义: \s 表示必须匹配字符串文字的元变量, \uppercase 是 RSL 语言外部的 DMS 函数的名称, ( ) 是元函数调用大写的元括号, 应用于匹配的字符串 \s。因为该规则在 AST 上运行,所以不能混淆;它不会更改 /* echo 'def' */ 的文本,因为那不是语句。
您可能需要几个规则来处理各种语法组合:在这种情况下,STRING 指的是单引号的文字字符串;双引号字符串不是整体实体,而是由一系列 QUOTED_STRING_FRAGMENTS 组成,这些 QUOTED_STRING_FRAGMENTS 对应于双引号字符串内的 PHP 表达式之间的双引号字符串中的文本。
在转换过程结束时,除了已应用转换的地方外,已更改的 AST 连同原始缩进和 cmets 一起发出。
还有一个用于 DMS 的完全语言准确的 JavaScript 解析器,如果您想准确处理 SCRIPT 标记的内容,则需要它。
如果您想对源代码进行可靠的更改,恕我直言,这是唯一的好方法。您可以尝试字符串破解和正则表达式,但解析 PHP 需要上下文无关的解析器,而 RE 不这样做,因此您得到的任何结果都不可信。