使用 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 后端代码中加入语法分析部分。

  1. ...
  2. require 'vendor/autoload.php';
  3. use PhpParser\ParserFactory;
  4. use PhpParser\Lexer;
  5. use PhpParser\Error;
  6. function ace_save_file() {
  7. check_ajax_referer( 'ace-nonce', 'ace_nonce' );
  8. global $wp_filesystem;
  9. $url = wp_nonce_url('admin.php?file_name=', 'ace_nonce');
  10. if (false === ($creds = request_filesystem_credentials($url, 'direct', false, false, null))) {
  11. return true;
  12. }
  13. if (!WP_Filesystem($creds))
  14. return false;
  15. if (preg_match("#\.php$#i", $_POST['filename'])) {
  16. //语法分析
  17. $code = stripslashes($_POST['ace_text']);
  18. $parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7, new Lexer);
  19. try {
  20. $stmts = $parser->parse($code);
  21. } catch (Error $e) {
  22. echo 'Parse Error: ', $e->getMessage();
  23. wp_die();
  24. }
  25. }
  26. $root = apply_filters('ace_filesystem_root', WP_CONTENT_DIR);
  27. $file_name = $root . "/uploads/" . $_POST['file_name'];
  28. $wp_filesystem->put_contents($file_name, stripslashes($_POST['ace_text']));
  29. wp_die();
  30. }

发表评论

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