使用 Php Parser 做实时 Php 语法分析

php parser with ace editor

在之前的文章中我们介绍过如何在 Post 中使用 ACE Editor,本篇文章进一步介绍使用 Php Parser 对 ACE Editor 编辑并保存的 Php 代码做语法分析,判断正确才能保存,否则将无法保存。

Php Parser 是一个开源的项目,用于对 Php 代码做语法分析,还可以把 Php 代码转换成 AST(抽象语法树)。

首先,在自己项目的根目录中使用 composer 安装 Php Parser,命令如下:

$composer require nikic/php-parser

安装完成后,在自己的 ACE Editor 后端代码中加入语法分析部分。

...
require 'vendor/autoload.php';
use PhpParser\ParserFactory;
use PhpParser\Lexer;
use PhpParser\Error;

function ace_save_file() {
    check_ajax_referer( 'ace-nonce', 'ace_nonce' );

    global $wp_filesystem;
    $url = wp_nonce_url('admin.php?file_name=', 'ace_nonce');
    if (false === ($creds = request_filesystem_credentials($url, 'direct', false, false, null))) {
        return true;
    }
    if (!WP_Filesystem($creds))
        return false;
    if (preg_match("#\.php$#i", $_POST['filename'])) {
        //语法分析
        $code = stripslashes($_POST['ace_text']);
        $parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7, new Lexer);
        try {
          $stmts = $parser->parse($code);
        } catch (Error $e) {
          echo 'Parse Error: ', $e->getMessage();
          wp_die();
        }
    }
    $root = apply_filters('ace_filesystem_root', WP_CONTENT_DIR);
    $file_name = $root . "/uploads/" . $_POST['file_name'];
    $wp_filesystem->put_contents($file_name, stripslashes($_POST['ace_text']));
    wp_die();
}

发表评论

邮箱地址不会被公开。 必填项已用*标注