【问题标题】:Ensure valid XHTML from a string in PHP确保 PHP 中字符串的 XHTML 有效
【发布时间】:2011-10-21 21:35:09
【问题描述】:

我正在使用 XHTML 过渡文档类型在浏览器中显示内容。但是,显示的内容是通过 XML 解析器 (DOMDocument) 传递的,以便在输出到浏览器之前进行最后的润色。

我为我的网站使用定制设计的 CMS,它允许我对网站进行更改。我有一个模块,它允许我以类似于 WordPress 小部件的方式在我的网站上显示 HTML 脚本。

我现在面临的问题是我需要确保通过此模块提供的任何代码都应采用有效的 XHTML 格式,否则模块将需要将代码转换为有效的 XHTML。目前,如果输入代码的一部分不符合 XHTML,那么我的 XML 解析器会中断并抛出警告。

我正在寻找一种解决方案,该解决方案对 URL 中存在的实体和通过 TextArea 控件提供的输入的文本部分进行编码。例如下面的字符串会破坏解析器给出实体引用错误:

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>

以下行也会导致同样的错误:

<a href="http://www.somesite.com">Books & Cool stuff<a/>

附:如果我使用htmlentitieshtmlspecialchars,它们还会转换标签的尖括号,这不是必需的。我只需要对字符串的 url 和文本部分进行转义/编码。

任何帮助将不胜感激。

感谢和问候, 瓦卡尔穆斯塔克

【问题讨论】:

  • 先用Tidy对其进行标准化。
  • 解决 XML 转义问题的正确方法是 facebook.com/notes/facebook-engineering/… - 但这是相当不标准的。因此,要保持输出 XHTML 语法兼容(即使您实际上使用错误的 MIME 类型发送它),实际上就是通过 libtidy 进行管道传输。
  • 感谢“hakre”你拯救了我的一天。整洁的性能有效吗?

标签: php xml-parsing html-entities htmlspecialchars


【解决方案1】:

HTML Tidy 是一个计算机程序和一个库,其目的是修复无效的 HTML 并改进生成的标记的布局和缩进样式。

http://tidy.sourceforge.net/

它能够修复的不良 HTML 示例:

  • 结束标签缺失或不匹配,标签混淆
  • 添加缺少的项目(一些标签、引号等)
  • 报告专有的 HTML 扩展
  • 将标记布局更改为预定义样式
  • 将字符从某些编码转换为 HTML 实体

【讨论】:

    【解决方案2】:

    您需要首先生成有效的 XHTML。你所有的属性都应该是htmlentitied。

    <script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>
    

    应该是

    <script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&amp;sumthing"></script>
    

    <a href="http://www.somesite.com">Books & Cool stuff</a>
    

    应该是

    <a href="http://www.somesite.com">Books &amp; Cool stuff</a>
    

    始终生成有效的 XHTML 并不容易。如果可能的话,我建议您找到其他方式进行后期处理。

    【讨论】:

    • 感谢分享,但是在粘贴到 textarea 控件之前修改每个代码 sn-p 是不可行的。我会让我的后端来处理它。
    • 那你就不行了,不然会出现输出格式不正确的情况。
    【解决方案3】:

    正如在快速评论中已经建议的那样,您可以使用PHP tidy extensionDocs 来解决问题,这很舒服。

    要将 HTML 片段(甚至是好的标签汤)转换为 DomDocumentSimpleXML 可以处理的内容,您可以使用以下内容:

    $config = array(
        'output-xhtml' => 1,
        'show-body-only' => 1
    );
    $fragment = tidy_repair_string($html, $config);
    $xhtml = sprintf("<body>%s</body>", $fragment);
    

    示例: 使用tidy_repair_stringDocs 将标签汤html 格式化为有效xhtml。

    Tidy has many options,这两个用于片段和 XHTML 兼容性。

    现在剩下的唯一问题是这个 XHTML 片段可以包含DomDocumentSimpleXML 不理解的实体,例如&amp;nbsp;。这和其他在 XML 中是未定义的。

    DomDocument 而言(你写你使用它),它支持loading html 而不是处理这些实体的xml:

    $dom = new DomDocument;
    $dom->loadHTML($xhtml);
    

    示例:使用 DomDocument 加载 HTML

    【讨论】:

    • 感谢整洁真的有帮助。还有一个问题。首先使用 tidy 解析文本然后加载到 XML 解析器中是否会产生开销?
    • @Waqar Mushtaq:如果它实际上允许您的系统按预期运行,我不会认为它是开销,而是必要的。如果$dom-&gt;loadHTML($fragment); 已经完成了这项工作,你可以试试。
    猜你喜欢
    • 2021-07-05
    • 2011-09-22
    • 1970-01-01
    • 2022-01-17
    • 2013-02-05
    • 2010-12-04
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多