94 lines
2.6 KiB
PHP
94 lines
2.6 KiB
PHP
|
<?php
|
||
|
|
||
|
class JSParser {
|
||
|
|
||
|
protected $content;
|
||
|
protected $keywords;
|
||
|
protected $regs = array();
|
||
|
protected $regsCounter = 0;
|
||
|
protected $strings = array();
|
||
|
protected $stringsCounter = 0;
|
||
|
|
||
|
protected function _extractRegs($match) {
|
||
|
$this->regs[$this->regsCounter] = $match[1];
|
||
|
$id = "<<reg{$this->regsCounter}>>";
|
||
|
$this->regsCounter++;
|
||
|
return $id;
|
||
|
}
|
||
|
protected function _extractStrings($match) {
|
||
|
$this->strings[$this->stringsCounter] = $this->importRegExps($match[0]);
|
||
|
$id = "<<s{$this->stringsCounter}>>";
|
||
|
$this->stringsCounter++;
|
||
|
return $id;
|
||
|
}
|
||
|
protected function importRegExps($input) {
|
||
|
$regs = $this->regs;
|
||
|
return preg_replace_callback("#<<reg(\d+)>>#", function ($match) use($regs) {
|
||
|
return $regs[$match[1]];
|
||
|
}, $input);
|
||
|
}
|
||
|
|
||
|
protected function importStrings($input) {
|
||
|
$strings = $this->strings;
|
||
|
return preg_replace_callback("#<<s(\d+)>>#", function ($match) use($strings) {
|
||
|
return $strings[$match[1]];
|
||
|
}, $input);
|
||
|
}
|
||
|
|
||
|
public function __construct($file, $keywords = '_') {
|
||
|
$this->content = file_get_contents($file);
|
||
|
$this->keywords = (array)$keywords;
|
||
|
}
|
||
|
|
||
|
public function parse() {
|
||
|
$output = htmlspecialchars($this->content, ENT_NOQUOTES);
|
||
|
|
||
|
// extract reg exps
|
||
|
$output = preg_replace_callback(
|
||
|
'# ( / (?: (?>[^/\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\/ )+ (?<!\\\\)/ ) [a-z]* \b #ix',
|
||
|
array($this, '_extractRegs'), $output
|
||
|
);
|
||
|
|
||
|
// extract strings
|
||
|
$output = preg_replace_callback(
|
||
|
array(
|
||
|
'# " ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)" #ix',
|
||
|
"# ' ( (?: (?>[^'\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\' )* ) (?<!\\\\)' #ix"
|
||
|
), array($this, '_extractStrings'), $output
|
||
|
);
|
||
|
|
||
|
// delete line comments
|
||
|
$output = preg_replace("#(//.*?)$#m", '', $output);
|
||
|
|
||
|
// delete multiline comments
|
||
|
$output = preg_replace('#/\*(.*?)\*/#is', '', $output);
|
||
|
|
||
|
$strings = $this->strings;
|
||
|
$output = preg_replace_callback("#<<s(\d+)>>#", function($match) use($strings) {
|
||
|
return $strings[$match[1]];
|
||
|
}, $output);
|
||
|
|
||
|
$keywords = implode('|', $this->keywords);
|
||
|
|
||
|
$strings = array();
|
||
|
|
||
|
// extract func calls
|
||
|
preg_match_all(
|
||
|
'# (?:'.$keywords.') \(\\ *" ( (?: (?>[^"\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\" )* ) (?<!\\\\)"\\ *\) #ix',
|
||
|
$output, $matches, PREG_SET_ORDER
|
||
|
);
|
||
|
|
||
|
foreach ($matches as $m) $strings[] = stripslashes($m[1]);
|
||
|
|
||
|
$matches = array();
|
||
|
preg_match_all(
|
||
|
"# (?:$keywords) \(\\ *' ( (?: (?>[^'\\\\]++) | \\\\\\\\ | (?<!\\\\)\\\\(?!\\\\) | \\\\' )* ) (?<!\\\\)'\\ *\) #ix",
|
||
|
$output, $matches, PREG_SET_ORDER
|
||
|
);
|
||
|
|
||
|
foreach ($matches as $m) $strings[] = stripslashes($m[1]);
|
||
|
|
||
|
return $strings;
|
||
|
}
|
||
|
}
|
||
|
?>
|