在 Pre 标记中转义 HTML 字符

2023-12-22

我已经安装了语法荧光笔,但为了使其工作,标签必须写为< and >。我需要做的是将所有 <和 > 的>但仅限于 PRE 标签内。

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

提前致谢。


tl;dr

您需要解析输入的 HTML。使用DOMDocument http://docs.php.net/manual/en/class.domdocument.php类来表示您的文档,解析输入,查找所有<pre>标签(使用findElementsByTagName http://docs.php.net/manual/en/domdocument.getelementsbytagname.php)并转义其内容。

Code

不幸的是,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>";
}

现在这个函数可以用来转义每一个<pre>文档中的节点:

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();
}

Test

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

Yields:

<!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 始终代表一个complete文档。因此,当 DOM 解析器获取文档片段时,它会填充缺失的信息。这使得输出可能与输入不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Pre 标记中转义 HTML 字符 的相关文章

随机推荐

  • ASP.NET MVC - 检查请求是否来自另一个操作

    有没有一种简单的方法来检查请求是否来自操作inside我的应用程序 我正在我正在开发的网站上构建电子邮件确认页面 并且我想在不同的请求来源上显示不同的文本 如果用户来自另一个操作 例如 注册操作 my app 然后我只想显示一段文字 内容如
  • 为什么我需要将此代码封装为简短的转换?

    如果我有如下代码 short myShortA 54 short myShortB 12 short myShortC short myShortA myShortB 两个操作数都是short 而且它会变成short 所以为什么我必须转换它
  • R 中的“嵌入式”data.frame。它是什么,它叫什么,为什么它的行为方式如此?

    我在 R 中有以下数据结构 df lt structure list ID c 1L 2L 3L 4L 5L var1 c a b c d e var2 structure list var2a c v w x y z var2b c vv
  • Google Protocol Buffer 错误:“序列化 Protocol Buffer 时遇到包含无效 UTF-8 数据的字符串”

    我正在使用以下代码 int lenSend odl gt ByteSize char buf char malloc lenSend odl gt SerializeToArray buf lenSend 我收到此错误 但我不明白为什么会收
  • 按对象的属性对对象向量进行排序

    我正在为学校做一个项目 需要对一些数据进行排序 我已经获得了一个对象向量 我必须根据对象的属性之一对对象进行排序 就地排序或使用索引 有几个不同的对象和几个不同的属性可以用来排序 执行此操作的最佳方法是什么 Use std sort和一个函
  • 刷新/重新绑定一个下拉列表 asp.net MVC

    我有一个下拉列表 其中包含类别列表和用于刷新下拉列表项目的链接 Html DropDownList CategoryNameItemNameBinding Model CatgegoryNameItems a href Refresh Ca
  • 如何以最少的字符串删除次数将字符串转换为回文?

    假设字符串是 anuja 输出应该是2 因为如果我删除字符 u 和 n 给定的字符串就会变成回文 因此输出应该是删除的最小数量 更多示例 输入字符串 ababa 输出 0 无需删除 输入字符串 abcdba 输出 1 删除 c 或 d 请解
  • Android 模拟器中的 HTTP 代理适用于浏览器,不适用于 WebView

    我的开发环境是后面的和HTTP代理 在 Android 模拟器中 我可以在 wifi 首选项中设置代理地址和凭据 然后 当我在浏览器中查看该页面时 系统会提示我重新输入指定主机的凭据 不知道为什么我必须再次输入它们 但它有效并且我能够查看该
  • 使用 Java 正则表达式来匹配 BMP 之外的一系列 Unicode 代码点:这可能吗?

    虽然一开始完全不相关 这个问题 https stackoverflow com q 26897498 1093528让我想知道 Java 的正则表达式基于Strings Strings 是序列 数组 chars and chars 最终是
  • 如何在 angularJS 控制器中编写 Switch 语句

    如何在 angularJS 控制器中编写 Switch 语句 我的源代码是 div table tr td x Name td td a href x Country a td tr table div
  • DataFrame 中基于标签的安全选择

    如何通过标签列表安全地选择 pandas 中的行 我想要得到并且Error当列表包含任何不存在的标签 Method loc如果索引中至少有 1 个您要求的标签 则不会引发 KeyError 但这还不够 例如 df pd DataFrame
  • 关闭应用程序后,一些 CoreData 关系会丢失

    这是我的问题的概述 我正在添加 并确认它们已添加 从肥皂服务加载到 CoreDat 的大约 1400 个关系 当我关闭应用程序并再次打开它后 一些关系就会丢失 我只看到了大约 800 个 尽管有所不同 另外 我没有收到任何错误 现在 更多细
  • 具有优先级的信号量

    我知道关于Semaphore类中的System Threading命名空间 但我不知道它是否允许等待线程具有不同的优先级 如果两个线程正在等待一个空位 有没有办法让优先级较高的线程拥有第一个空位 来自MSDN 文档 http msdn mi
  • 想用cmake制作独立程序

    我的程序使用giblib和Imlib2库 它是用cmake构建的 它在我的计算机上运行良好 但在其他计算机上则不然 我想原因是我安装了我的程序需要的每个库 但其他库没有 我的目标是制作独立程序 不需要额外安装任何其他库 我应该在cmake文
  • 民意调查结果栏的好技术是什么?

    我正在创建一些民意调查软件 目前正在研究制作民意调查结果图表栏的技术 没什么复杂的 只是一些简单的结果吧 我想知道是否有任何经过验证的 真正的最佳方法 我想到的最好的办法是为每个栏设置一个 div 容器 然后是一个图像或其他一些元素 您可以
  • 搜索并替换整个项目 (Netbeans)

    有没有办法在 netbeans 中进行项目范围的搜索和替换 好像应该有 但我找不到任何相关信息 Thanks 在下面Edit菜单你应该找到一个菜单项Replace in Projects
  • 从表单应用程序打开 WPF 设置窗口 [重复]

    这个问题在这里已经有答案了 可能的重复 WPF UI 关闭时的通知 https stackoverflow com questions 12696649 notification when wpf ui closes 我之前问过一个非常类似
  • 分区的目的是什么

    例如 如果我打算对某些元素进行分区 我可以这样做 Stream of I Love Stack Overflow collect Collectors partitioningBy s gt s length gt 3 forEach k
  • 如果源脚本在函数中运行,为什么 bash 变量不是全局变量?

    通常从另一个脚本获取文件 我可以访问它的变量 如果我从函数内部获取脚本 它的变量aren tglobal 这似乎与联机帮助页相矛盾 FUNCTION函数的局部变量可以使用 local 内置命令来声明 通常 变量及其值在函数及其调用者之间共享
  • 在 Pre 标记中转义 HTML 字符

    我已经安装了语法荧光笔 但为了使其工作 标签必须写为 lt and gt 我需要做的是将所有 lt 和 gt 的 gt 但仅限于 PRE 标签内 所以 简而言之 我想转义 pre 标记内的所有 HTML 字符 提前致谢 tl dr 您需要解