我正在写一个小课程来用PHP缩小JavaScript。我班上有以下有问题的代码:
private function test_opener($str, $i) {
if(ord($str[$i]) === 34 or ord($str[$i]) === 39)
{
if($this->_is_string_opened)
{
if($this->_string_opener === $str[$i] and ! $this->is_escaped($str, $i))
{
$this->_is_string_opened = false;
$this->_string_opener = null;
}
}
else
{
$this->_is_string_opened = true;
$this->_string_opener = $str[$i];
}
}
}
我的类循环遍历文件中的每个字符。上面的函数检测字符串打开/关闭字符('
和"
)。 0x34
和0x39
分别是"
和'
的字符代码。如果检测到其中一个字符,is_string_opened
将翻转为true
,如果这是第一个打开强者的字符,或false
如果字符关闭字符串。
现在,当我尝试缩小以下JavaScript(取自Underscore.js的源代码)时,我的代码中断了:
var entityMap = {
escape: {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''' // Here be dragons
}
};
entityMap.unescape = _.invert(entityMap.escape);
当解析器到达'''
时,会附加什么:第一个'
将_is_string_open
切换为true
。 '
,'
的HTML十六进制实体表示法,将其关闭,最后'
再次启用它。因此,代码的其余部分将被解释为文本,直到下一个'
,这显然会破坏文件解析过程。
我不理解这种PHP行为。 &;#x27;
的字符代码甚至不是39
,而是38
。我在PHP 5.5.9上运行了代码。编码是UTF-8,内容直接来自POST,但我尝试添加htmlentities()
来逃避这种有问题的角色,没有任何改变。
编辑:数据来源(控制器获取发布数据)
$js = $_POST['javascript_content'] ?: null;
if($js)
{
$output_js = Jsmin::forge($js)
->min()
->join()
->get();
}