2014-02-26 19 views
9

我在PHP中使用HTML Tidy,并且由于JavaScript字符串文字中的<script>标记而产生意外结果。这里有一个样本输入:HTML Tidy在JavaScript字符串文字中的脚本标记上失败

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

HTML整洁的输出:

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

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

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

+3

我会说“打开bug票”,但他们没有任何意味着在他们的网站上这样做... – akonsu

+0

i一个有趣的错误,但似乎非常具体的关闭脚本标记,我只是使用你当前的解决方案..也用于输出<和/脚本>分别迷惑我 – clancer

+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>

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> 
0

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

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

单程i s使它整洁不检测脚本标记。我能想出的“最干净”的方式是逃避标签中的角色。

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

,所以你甚至可以做到这一点,而不必打破串起来如上:

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

没有必要为字符串连接,以避免关闭</script>。简单地转义/字符足以“傻瓜”在浏览器中的解析器和,看来,HTML整洁的解析器,以及:

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

这只是按预期工作

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

顺便说一句,串连接并不是最好的方式来创建动态的HTML插入页面,寻找document.createElement,甚至模板引擎(handlebars.js是我最喜欢的)