使用 Php Parser 做实时 Php 语法分析
在之前的文章中我们介绍过如何在 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();
}