我在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中发生此错误?
答案 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是我最喜欢的)