撇号与其html十六进制符号冲突

时间:2014-06-03 17:59:20

标签: php parsing

我正在写一个小课程来用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];
            }
        }
}

我的类循环遍历文件中的每个字符。上面的函数检测字符串打开/关闭字符('")。 0x340x39分别是"'的字符代码。如果检测到其中一个字符,is_string_opened将翻转为true,如果这是第一个打开强者的字符,或false如果字符关闭字符串。

现在,当我尝试缩小以下JavaScript(取自Underscore.js的源代码)时,我的代码中断了:

var entityMap = {
    escape: {
      '&': '&',
      '<': '&lt;',
      '>': '&gt;',
      '"': '&quot;',
      "'": '&#x27;' // Here be dragons
    }
  };
  entityMap.unescape = _.invert(entityMap.escape);

当解析器到达'&#x27;'时,会附加什么:第一个'_is_string_open切换为true&#x27;'的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();
}

0 个答案:

没有答案