2010-08-04 91 views
2

几乎所有的浏览器在呈现无效的HTML时都会有一定的余地。例如,他们会渲染x < y,就好像它被编写为x &lt; y一样,因为它“清楚”<的目的是作为文字字符,而不是HTML标记的一部分。无效的HTML呈现逻辑

我在哪里可以找到该逻辑作为单独的“清理”模块?这样的模块会将x < y转换为x &lt; y

+0

你在用什么?如果你正在渲染用户内容,那么最好是逃避谁和输出它。如果你正在写渲染引擎......祝你好运。 – 2010-08-04 17:52:36

+0

我正在渲染用户内容,但我想保留某些“安全”标签。我已经在使用删除“不安全”标签的模块,但它也删除了看起来像无法识别标签的无效HTML。在将它交给模块之前,我想“清理它”。 – JoelFan 2010-08-04 17:56:20

+0

检查我的答案,你可以做到这一点没有任何模块 – 2010-08-04 18:03:17

回答

3

请试试看Tidy的源代码。通过整理运行前

HTML:

<html> 

<head> 
    <title>boo</title> 
</head> 

<body> 
    x < y 
</body> 

</html> 

经过整理后运行相同的HTML:

<html> 
<head> 
    <meta name="generator" content= 
    "HTML Tidy for Linux (vers 25 March 2009), see www.w3.org"> 

    <title>boo</title> 
</head> 

<body> 
    x &lt; y 
</body> 
</html> 

注意x < y改为x &lt; y

UPDATE

基于您的评论,你应该使用整洁清理你的HTML。我相信大多数常用语言都有Tidy库,可以为您清理HTML。如果您使用PHP,则有PHP Tidy

UPDATE

我注意到,你说你正在使用C#。您也可以在C#中使用Tidy。这是我找到的东西。我不C#开发,我还没有尝试过这一点,所以因人而异:在浏览器中

Fix Up Your HTML with HTML Tidy and .NET

0

不确定你的意思到底是什么,但也许PHP函数htmlentities可以帮助你。

+0

没有......看到我回应@Mike卡隆的评论 – JoelFan 2010-08-04 17:57:44

0

渲染无效的HTML的是可怕的猜测,你真的不应该试图效仿它(它将打破)。但是,更换一些事件可能与正则表达式来完成:

preg_replace('/(\s)<(\s)/', '$1&lt;$2', $data); 
+0

这将改变''< body>到'<体>'。不可取的。 – 2010-08-04 18:01:24

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Chuck 2010-08-04 18:29:58

+0

@Vivin:是的。它在一定程度上依赖于用户正确地格式化他们的输入,但它相当好。 @Chuck:我们实际上并不是在这里解析HTML,而是。 – You 2010-08-04 19:43:10

-1

编辑:我假设你正在使用PHP,因为你没有指定

使用用strip_tags:

$content = strip_tags($content, array('<b><i>')); 

这将留下安全标签(由您定义),并删除其他所有内容。

+2

这是一个很大的假设 – Quentin 2010-08-04 18:11:37

+0

我没有使用PHP,但我在C#中使用类似于strip_tags的东西。问题是我的“strip_tags”认为“x JoelFan 2010-08-04 18:18:39

+0

@David这是最常见的Web开发语言。而且,其他人也都这样认为。责任在OP上指定,对吧? – 2010-08-04 20:02:01