【问题标题】:Where can I find the JSLint / js validation parser written in PHP?在哪里可以找到用 PHP 编写的 JSLint / js 验证解析器?
【发布时间】:2011-06-24 20:33:35
【问题描述】:

我为构建脚本使用了 JSLint 的 PHP 版本。但不是我写的……我的前同事写的。但是现在,我不记得名字是什么了,我在哪里可以找到 PHP 库为我做的 JSLint 事情。有知道的吗?谢谢。

【问题讨论】:

    标签: php javascript jslint


    【解决方案1】:

    试试:

    http://www.overflow.biz/blog/lang/en-us/2010/07/07/jslint-php-class/

    与:

    http://www.javascriptlint.com/download.htm

    来自第一个链接的代码(归功于 z3n)

    解决方案:

    // (c) z3n - R1V1@100707 - www.overflow.biz - rodrigo.orph@gmail.com
    // Based on the original by Matthias Miller (http://www.JavaScriptLint.com/)
    
    class JSLEngine {
        private $_binarypath;  // jlint exec
        private $_confpath;    // config path
        private $fn;           // temp filename (not used outside class)
        private $r;            // jlint output
        private $has_errors=0; // error flag
    
        public function __construct($binarypath="", $confpath="") {
            // default paths
            base_defines(array(
                "jslint_binary_path" => _fn_fix(dirname(dirname(dirname(__FILE__)))."/3rd/jsl-0.3.0/jsl.exe"),
                "jslint_conf_path" => _fn_fix(dirname(dirname(dirname(__FILE__)))."/3rd/jsl-0.3.0/jsl.default.conf")
            ));
    
            // startup
            $this->_binarypath = $binarypath == "" ? jslint_binary_path : $binarypath;
            $this->_confpath = $confpath == "" ? jslint_conf_path : $confpath;
        }
    
        public function __destruct() {
            if ($this->fn != null && file_exists($this->fn))
                unlink($this->fn);
        }
    
        /* returns error on failure; returns true on success */
        public function Lint($code) {
          if (!$this->_launchLintBinary($code, $output))
              die('The JavaScript Lint online service is currently unavailable.');
    
          // store lint
          $this->r=$output;
          $output=explode("\n",$output); // break lines
          $x=$output[count($output)-2]; // X error(s), X warning(s) (total lines -2)
          $x=trim(substr($x,0,strpos($x," ")));
          if ($x > 0) { // has errors
              $this->has_errors=1;
              return false;
          } else { // clean
              $this->has_errors=0;
              return true;
          }
        }
    
        /* assumes path and that SERVER_SOFTWARE env is set */
        private function _launchLintBinary($input, &$output) {
        $descriptorspec = array(
            0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
            1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
            2 => array("pipe", "w")
        );
    
        $this->fn=_fn_fix(dirname(__FILE__).'/tmp.js');
    
        file_put_contents($this->fn,$input);
        /* launch process */
        $path = PHP_OS == "WINNT" ? $this->_binarypath : escapeshellcmd($this->_binarypath);
        $path.= ' --nologo --conf '.escapeshellarg($this->_confpath).' --process '.escapeshellarg($this->fn);
    
        $process = proc_open($path, $descriptorspec, $pipes);
        if (!is_resource($process))
            return false;
    
        $output = '';
        while (!feof($pipes[1]))
           $output .= fgets($pipes[1], 1024);
        fclose($pipes[1]);
        fclose($pipes[2]);
    
        // It is important that you close any pipes before calling
        // proc_close in order to avoid a deadlock
        $return_value = proc_close($process);
        return true;
        }
    
        public function output() {
            return $this->r;
        }
    }
    

    辅助函数:

    function _fn_fix($fn,$force="") { // v1.02
        if (strpos($fn,"://") === false) {
            if ((PHP_OS == "WINNT" && $force == "") || $force == "WINNT")
                $fn=str_replace("/","\\",$fn);
            else
                $fn=str_replace("\\","/",$fn);
        }
        if (strpos($fn,":/") !== false && strpos($fn,"://") === false)
            $fn=substr($fn,2);
    
        return $fn;
    }
    
    function base_defines($x) { // define default
        foreach ($x as $k => $v) {
            if (!defined($k)) {
                define($k,$v);
            }
        }
    }
    

    用法:

    $lint=new JSLEngine();
    if (!$lint->Lint($js)) {
        echo "bad js code! full output:\n";
        echo $lint->output();
    }
    

    必填:

    来自http://www.JavaScriptLint.com/的jslint二进制文件

    确保您在 __construct 上设置了默认路径,因此您无需在每次调用时都设置它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多