本文介绍了在哪里可以找到用PHP编写的JSLint/js验证解析器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用PHP版本的JSLint作为构建脚本.但是我没有写..我的前同事写了.但是现在,我不记得它的名字了,在哪里可以找到PHP库对我来说对JSLint有用.知道吗解冻.

解决方案

尝试:

http://www .overflow.biz/blog/lang/zh-cn/2010/07/07/jslint-php-class/

使用方式:

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

第一个链接的代码(贷记到z3n)

解决方案:

// (c) z3n - R1V1@100707 - www.overflow.biz - [email protected]
// 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上设置了默认路径,因此无需在每次调用时都进行设置.

I have used a PHP version of JSLint for the build script. But I didn't write it.. my ex-coworker did. But now, I can't remember what the name is, and where can I find that PHP library do to JSLint thing for me. Any know? Thaks.

解决方案

Try:

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

With:

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

Code from first link (credit to z3n)

Solution:

// (c) z3n - R1V1@100707 - www.overflow.biz - [email protected]
// 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;
    }
}

Helper functions:

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);
        }
    }
}

Usage:

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

Required:

jslint binaries from http://www.JavaScriptLint.com/

Make sure you set the default path on the __construct, so you don’t need to keep setting it on every call.

这篇关于在哪里可以找到用PHP编写的JSLint/js验证解析器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-12 01:00