HTML Tidy在JavaScript字符串文字中的脚本标记上失败

时间:2014-02-26 00:31:37

标签: javascript php html

我在PHP中使用HTML Tidy,由于JavaScript字符串文字中的<script>标记,它会产生意外结果。这是一个示例输入:

<html>
<script>
var t='<script><'+'/script>';
</script>
</html>

HTML Tidy的输出:

<html>
<script>
//<![CDATA[
var t='<script><'+'/script>';
<\/script>
<\/html>
//]]>
</script>
</html>

它将</script></html>解释为脚本的一部分。然后,它添加另一个</script></html>来关闭打开的标记。我在HTML Tidy(http://www.dirtymarkup.com/)的在线版本上尝试了这个,它产生了同样的错误。

如何防止在PHP中发生此错误?

6 个答案:

答案 0 :(得分:6)

在玩了一下之后,我发现可以使用注释//'<\/script>'来混淆算法以防止此错误发生:

<html>
<script>
var t='<script><'+'/script>'; //'<\/script>'
</script>
</html>

清理后:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">

<html>
<head>

   <script>
var t='<script><'+'/script>'; //'<\/script>'
   </script>

   <title></title>
</head>

<body>
</body>
</html>

我的猜测是,当清理算法查看代码并检测到字符串<script>两次时,它会立即查找</script>。将</script>分开会使第二个</script>未被检测到,这就是为什么它决定在代码末尾添加另一个</script>并以某种方式也用antoher关闭它</html>。 (确实糟糕的设计!)

所以我做了第二个假设,即算法中没有if语句来确定</scirpt>是否在评论中,我是对的!将另一个字符串<\/script>作为javascript注释确实会让算法认为总共有两个</script>

答案 1 :(得分:1)

不需要字符串连接来避免关闭</script>。简单地转义/字符足以“欺骗”浏览器中的解析器,似乎也是HTML Tidy的解析器:

<html>
<script>
var t='<script><\/script>';
</script>
</html>

答案 2 :(得分:0)

尝试使脚本标记不是一个完整的单词,而是一个字符串连接

<html>
<script>
var t='<scr'+'ipt><'+'/script>';
</script>
</html>

产生的清理代码

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">

<html>
<head>

    <script>
var t='<scr'+'ipt><'+'/script>';
    </script>

    <title></title>
</head>

<body>
</body>
</html>

答案 3 :(得分:0)

这可能是创建这样的脚本标记的更好方法: (这也应该解决你的整洁问题)

<script>
    script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'http://myserver.com/file.js';
    document.getElementsByTagName('head')[0].appendChild(script);   
</script>

答案 4 :(得分:0)

一种方法是使它如此整洁不检测脚本标记。我能想到的“最干净”的方式是逃避标签中的角色。

<html>
<script>
var t='<\script><'+'/script>';
</script>
</html>

所以你甚至可以这样做,而不必像上面那样打破字符串:

var t='<\script></\script>';

答案 5 :(得分:0)

这只是按预期工作

<html>
    <script>
        var t='<'+'script><'+'/script>';
    </script>
</html>

顺便说一句,字符串连接不是创建动态HTML以在页面中插入的最佳方式,查找document.createElement甚至是模板引擎(handlebars.js是我最喜欢的)