【问题标题】:Escape HTML Chars In the Pre Tag在 Pre 标记中转义 HTML 字符
【发布时间】:2012-03-31 20:33:16
【问题描述】:

我已经安装了一个语法高亮,但是为了让它工作,标签必须写成<>。我需要做的是用< 替换所有> 替换>,但只在PRE 标记内。

所以,简而言之,我想转义 pre 标记内的所有 HTML 字符。

提前致谢。

【问题讨论】:

  • 不确定我是否理解 - 您是否尝试转义 HTML 代码以将其显示在您的页面上?
  • 是的,但仅限于“pre”标签内。
  • 在标签内容上使用htmlspecialchars,然后再使用echo。这就是你应该在 everything 上做的事情,然后再回显它。
  • @Jon 但是我如何只在 pre 标签中使用它?
  • 如果你使用过 MVC 模式,那么在你的代码中你应该知道它在视图中输出
     标签的确切位置,并且能够非常简单地添加htmlspecialchars

标签: php html replace pre


【解决方案1】:

tl;博士

您需要解析输入的 HTML。使用DOMDocument 类来表示您的文档,解析输入,找到所有<pre> 标签(使用findElementsByTagName)并转义它们的内容。

代码

不幸的是,DOM 模型非常低级,它迫使您自己迭代 <pre> 标记的子节点,以逃避它们。如下所示:

function escapeRecursively($node) {
    if ($node instanceof DOMText)
        return $node->textContent;

    $children = $node->childNodes;
    $content = "<$node->nodeName>";
    for ($i = 0; $i < $children->length; $i += 1) {
        $child = $children->item($i);
        $content .= escapeRecursively($child);
    }

    return "$content</$node->nodeName>";
}

现在这个函数可以用来转义文档中的每个&lt;pre&gt;节点:

function escapePreformattedCode($html) {
    $doc = new DOMDocument();
    $doc->loadHTML($html);

    $pres = $doc->getElementsByTagName('pre');
    for ($i = 0; $i < $pres->length; $i += 1) {
        $node = $pres->item($i);

        $children = $node->childNodes;
        $content = '';
        for ($j = 0; $j < $children->length; $j += 1) {
            $child = $children->item($j);
            $content .= escapeRecursively($child);
        }
        $node->nodeValue = htmlspecialchars($content);
    }

    return $doc->saveHTML();
}

测试

$string = '<h1>Test</h1> <pre>Some <em>interesting</em> text</pre>';
echo escapePreformattedCode($string);

产量:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><h1>Test</h1> <pre>Some &lt;em&gt;interesting&lt;/em&gt; text</pre></body></html>

请注意,DOM 始终代表一个完整文档。因此,当 DOM 解析器获取文档片段时,它会填充缺失的信息。这使得输出可能与输入不同。

【讨论】:

  • 谢谢!除了一个小错误外,工作正常。这在我加载页面时显示:/www.w3.org/TR/REC-html40/loose.dtd">
  • @Terry 你正在加载什么页面?我的示例代码在浏览器中显示得很好。
  • 查看帖子页面。我测试过了,它只在我添加你的代码时发生。
  • @Terry 不过,我相当有信心错误在其他地方,只是通过添加我的代码来清除。它是孤立地工作的。因为我不知道你的代码,所以我真的不能再说什么了。
猜你喜欢
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多