自动解析PHP以将PHP代码与HTML分离

我正在开发一个大的PHP代码库;我想将PHP代码与HTML和JavaScript分开。 (我需要对PHP代码进行多次自动搜索和替换,并在HTML上进行不同的搜索和替换,并且在JS上有所不同)。是否有一个很好的解析器引擎可以为我分离PHP?我可以使用正则表达式来做到这一点,但它们并不完美。我可以在ANTLR中构建一些东西,但是一个好的现有解决方案将是最好的。 我应该说清楚:我不想要或不需要一个完整的PHP解析器。只需要知道给定的令牌是否: - PHP代码 - PHP单引号字符串 - PHP双引号字符串 - PHP评论 - 不是PHP,而是HTML / JavaScript     
已邀请:
如何将标记生成器内置到PHP本身?   标记器功能提供了一个   PHP tokenizer的接口   嵌入在Zend引擎中。运用   这些功能你可以写自己的   PHP源代码分析或修改   工具无需处理   词汇的语言规范   水平。 您在评论中询问是否可以从标记化输出中重新生成代码 - 但是您可以将所有空格保留为T_WHITESPACE标记。以下是将标记化输出转换回代码的方法:
$regenerated='';

$tokens = token_get_all($code);
foreach($tokens as $idx=>$t)
{
    if (is_array($t))
    {

         //do something with string and comments here?
         switch($t[0])
         {
             case T_CONSTANT_ENCAPSED_STRING:
                  break;
             case T_COMMENT:
             case T_DOC_COMMENT:
                 break;

         }
         $regenerated.=$t[1];


    }
    else
    {
         $regenerated.=$t;
    }
}
    
为了将PHP与其他PHP分开,PHP的内置标记器是您的最佳选择:请参阅
token_get_all()
对于其他人来说,最好使用DOM解析器。隔离
<script>
部分(和外部脚本,甚至
onXXXX
事件)很容易。 但是,从解析的DOM树重新构建相同的文档可能很难 - 我想这取决于您需要对结果做什么以及原始HTML的清洁程度。正则表达式(yuck!)可以更好地适用于该部分。     
如果你想要做的就是检查令牌,那么PHP tokenizer就像其他人所建议的那样,可能是个不错的选择。 如果您想要做的是以可靠的方式自动更改源代码,我不确定这会对您有所帮助。您将如何重新生成修改后的源文本? 另一种方法是使用程序转换引擎。这样的引擎可以解析源文本以抽象语法树,捕获程序的结构(以及所有令牌的有效内容),并允许使用可靠的模式匹配/转换来搜索和转换那些AST。要做到这一点,你需要一个可靠地解析PHP的引擎, 并且可以从更改的AST中重现可编译的源文本。 我们的DMS软件再造工具包就是这样一个程序转换系统,它有一个强大的PHP前端,可以在解析,转换和将结果重新打印回文本方面准确地处理PHP5。 (正确使用PHP解析器很难,因为语言记录很差)。因为前端可以准确地获取HTML和PHP代码,所以您不需要分离文本;它们将停放在独特树节点中清晰可辨的地方。 要将所有回显的字符串从小写更改为大写,您可以使用DMS来解析PHP,然后应用以下转换规则:
 rule uppercase_echoed_string(s: STRING): statement -> statement
 =   "echo s;" ->  "echo uppercase(s);".
此规则是用DMS的规则规范语言(RSL)编写的,显然不是PHP。引号内的东西是PHP代码;这些是围绕被操作的程序设计语言的文本的元引号。 chararacter是一个元转义: s表示必须与字符串文字匹配的元变量, uppercase是RSL语言外部的DMS函数的名称,而()是元函数调用大写的元括号,应用于匹配的字符串 s。因为规则在AST上运行,所以不能混淆;它不会改变/ * echo'def'* /的文本,因为这不是一个声明。 您可能需要几个规则来处理各种语法组合:在这种情况下,STRING只引用单引号的文字字符串;双引号字符串不是单片实体,而是由一系列QUOTED_STRING_FRAGMENTS组成,这些QUOTED_STRING_FRAGMENTS对应于双引号字符串中PHP表达式之间的双引号字符串中的文本。 在转换过程结束时,更改的AST将使用原始缩进和注释完成,除非应用了转换。 对于DMS,也有一个完全语言准确的JavaScript解析器,如果您想要准确处理SCRIPT标签的内容,则需要这些解析器。 如果您想对源代码进行可靠的更改,这个恕我直言是唯一的好方法。你可以尝试字符串黑客和正则表达式,但解析PHP需要一个无上下文的解析器而RE不会这样做,所以你得到的任何结果都不值得信任。     

要回复问题请先登录注册