格式丰富的内容的标记语言是什么?

时间:2008-12-05 05:08:58

标签: html formatting markdown markup bbcode

当您开发基于Web的应用程序并且希望允许来自用户的格式丰富的文本时,您必须选择如何允许该输入。已经创建了许多不同的标记语言,因为消除HTML可能更加困难。

各种不同标记语言的优点和缺点如下:

或者换句话说,在选择使用特定标记语言时,您会考虑哪些因素。

4 个答案:

答案 0 :(得分:10)

Markdown,BBCode,Textile,MediaWiki标记基本上都是相同的概念,所以我真的把它归为两类:HTML和纯文本标记。

HTML

与HTML的交易是内容已经是Web内容的“可呈现”形式。这很棒,节省了处理时间,而且它是一种易于解析的语言。几乎所有语言中都有数十个库来处理HTML内容,转换为HTML或从HTML转换为其他格式等。主要的缺点是,由于早期网络日的标准松散,HTML可以变化很大,你可以在接受用户的HTML时,总是依赖于理智的输入。正如所指出的那样,整理或消毒HTML通常非常困难,特别是因为它无法像XML那样遵循正常的标记规则(即不正确的标记很常见)。

纯文本标记

此类别经常被使用,原因如下:

  • 易于从一个来源解析为多种形式 - PDF,HTML,RTF
  • 如果以后需要,内容以可读的纯文本形式存储(通常比原始HTML更容易阅读),而不是需要从HTML中提取
  • 遵循特定的定义规则,其中HTML可能令人烦恼变量和非结构化
  • 允许您强制部分内容格式设置在许多情况下比仅仅允许完整HTML
  • 更合适
  • 除了强制HTML的子集外,还可以轻松清理输入并防止跨站点脚本问题等。
  • 以抽象格式保存“原始”数据意味着在以后,如果您希望将站点从HTML 4转换为XHTML,则只需更改解析代码即可。使用HTML格式的用户输入,您现在必须单独将所有HTML转换为XHTML,正如HTML Tidy所示,并不总是一项简单的任务。类似地,如果在某个时刻出现新的标记语言,或者您需要转换为替代格式(RTF,PDF,TeX),则抽象的受限制的文本格式化选项子集使这一任务变得更加简单。

底线是用于输入的用户输入。如果您计划保留数据并且可能需要随机播放格式等,那么使用谨慎的抽象格式来存储信息是有意义的。如果您因任何原因需要手动处理原始数据,那么如果该格式易于人类阅读,则可获得奖励积分。如果您只是在网页中显示内容(或者报告的HTML文档等),并且您不担心转换它或面向未来,那么将它存储在HTML中是合理的做法。

答案 1 :(得分:5)

Jeff discussed some pros and cons在codinghorror.com上,当他们处于组合SO的初始阶段时。我认为这是值得一读的。

答案 2 :(得分:0)

@netrox数据库不是问题,浏览器输出是。

唯一的问题是最终呈现可以被用户插入的HTML破坏。例如,用户可以打开<li>标签但从不关闭它,这取决于页面的结构,可能会破坏随后的整个布局。或者另一个示例打开<strong>标记而不关闭它,使所有剩余内容变为粗体。

因此,不仅必须验证允许的标签,而且您是如何允许某些标签而不是其他标签?因为很容易使用htmlspecialchars() PHP方法来防止解析所有HTML标记,但是当涉及到允许某些标记时,您将不得不寻找其他方法。有strip_tags() PHP函数删除(完全删除)不允许的标签,但这意味着以不好的方式改变用户的内容,阻止用户发布简单的代码(例如共享/显示的代码,不是要处理的代码。)

除了打破布局之外,您还必须考虑XSS攻击,例如将javascript插入到链接的href属性中,例如可以将用户重定向到另一个站点。请参阅以下可能的XSS攻击列表:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

正如您所看到的,防止所有HTML标记被解释非常容易,但仅防止某些标记要复杂得多。要理解这一点,你可以看一下巨大的“HTML Purifier”框架,其唯一目的是允许一些HTML标签,并确保输出的HTML有效(即不会破坏页面)并且没有XSS攻击。

答案 3 :(得分:-1)

“已经创建了许多不同的标记语言,因为消除HTML可能会更加困难。”

真的?怎么这么难?在数据库或文件中输入HTML之前,有一些功能可以删除潜在危险的属性或标记并验证HTML。你能举例说明如何清理HTML很难吗?