php - 检测字符串中的 HTML 并用代码标签包装

2024-01-18

我在处理文本内容中的 HTML 时遇到了麻烦。我正在考虑一种方法来检测这些标签并将所有连续的标签包装在代码标签内。

别包裹我<p>Hello</p><div class="text">wrap me please!</div><span class="title">wrap me either!</span>别包裹我<h1>End</h1>.

//预期结果

别包裹我<code><p>Hello</p><div class="text">wrap me please!</div><span class="title">wrap me either!</span></code>别包裹我<code><h1>End</h1></code>.

这可能吗?


在这种特定情况下很难使用 DOMDocument,因为它会自动将文本节点包装为<p>标签(并添加 doctype、head、html)。一种方法是使用以下方法构建一个模式作为词法分析器(?(DEFINE)...)特征和命名子模式:

$html = <<<EOD
Don't wrap me<p>Hello</p><div class="text">wrap me please!</div><span class="title">wrap me either!</span> Don't wrap me <h1>End</h1>
EOD;

$pattern = <<<'EOD'
~
(?(DEFINE)
    (?<self>    < [^\W_]++ [^>]* > )
    (?<comment> <!-- (?>[^-]++|-(?!->))* -->)
    (?<cdata>   \Q<![CDATA[\E (?>[^]]++|](?!]>))* ]]> )
    (?<text>    [^<]++ )
    (?<tag>
        < ([^\W_]++) [^>]* >
        (?> \g<text> | \g<tag> | \g<self> | \g<comment> | \g<cdata> )*
        </ \g{-1} >
    )
)
# main pattern
(?: \g<tag> | \g<self> | \g<comment> | \g<cdata> )+
~x
EOD;

$html = preg_replace($pattern, '<code>$0</code>', $html);

echo htmlspecialchars($html);

The (?(DEFINE)..)功能允许将定义部分放入正则表达式模式中。此定义部分和其中的命名子模式不匹配任何内容,它们稍后将在主模式中使用。

(?<abcd> ...)定义一个您可以稍后重用的子模式\g<abcd>。在上面的模式中,以这种方式定义的子模式是:

  • self: 描述一个自闭合标签
  • comment: 用于 html 注释
  • cdata:对于 cdata
  • text: 用于文本(除标签、注释或 cdata 以外的所有内容)
  • tag: 对于非自闭合的 html 标签

self:
[^\W_]是一个获得的技巧\w没有下划线。[^\W]++代表标签名称并且也在tag子模式。
[^>]*意味着所有不是>零次或多次。

comment:
(?>[^-]++|-(?!->))*描述 html 注释中所有可能的内容:

(?>          # open an atomic group
    [^-]++   # all that is not a literal -, one or more times (possessive)
  |          # OR
    -        # a literal -
    (?!->)   # not followed by -> (negative lookahead)
)*           # close and repeat the group zero or more times 

cdata:
之间的所有字符\Q..\E被视为文字字符,特殊字符,例如[不需要逃避。 (这只是使模式更具可读性的一个技巧)。
CDATA 中允许的内容的描述方式与 html 注释中的内容相同。

text:
[^<]++直到左尖括号或字符串末尾的所有字符。

tag:
这是最有趣的子模式。第 1 行和第 3 行是开始标签和结束标签。请注意,在第 1 行中,标记名称是使用捕获组捕获的。在第 3 行中,\g{-1}指的是最后定义的捕获组匹配的内容(“-1”表示“左边一个”)。
第 2 行描述了开始标签和结束标签之间可能的内容。您可以看到,此描述不仅使用之前定义的子模式,还使用当前子模式本身来允许嵌套标签。

一旦设置了所有项目并关闭了定义部分,您就可以轻松编写主要模式。

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

php - 检测字符串中的 HTML 并用代码标签包装 的相关文章

  • 如何在 Ruby 中转义单引号?

    我通过一个脚本 不是我的 将一些 JSON 传递到服务器 该脚本接受 JSON 作为字符串 JSON 的某些内容包含单引号 因此我想确保在传递给脚本之前对所有单引号进行转义 我已经尝试过以下方法 gt irb gt 1 9 3p194 00
  • CryptoJS 使用密码加密 AES,但 PHP 解密需要密钥

    我在用CryptoJS https code google com p crypto js AES加密字符串 function doHash msg msg String msg var passphrase aggourakia var
  • 使用第三方库记录来自 PHP 应用程序的所有 cURL 请求

    好吧 我的 PHP Yii2 应用程序遇到了困难 我需要记录来自应用程序的每个传入和传出请求 传入的请求可以轻松地记录在 PHP 本身中 在引导阶段添加一些处理程序 这很容易 但真正的问题是我正在使用许多第三方库 即 Amazon MWS
  • html 图像 src 调用 javaScript 变量

    这是我的代码 我想问 我怎样才能做到这一点 img src img apple 我一直在尝试使用 call 函数和 document onload 但它根本不起作用 有人可以救我吗 我假设你只是想用 javascript 更新图像 src
  • Zend RegEx Validator 的自定义有意义的错误消息

    我正在验证表单中的文本字段 如下所示 name new Zend Form Element Text name name gt setLabel First Name gt setRequired true gt addFilter new
  • 优雅地退出 Laravel 作用域

    我有一个范围 它根据用户角色以限制方式起作用 您可以将一组规则转发到限制数据库最终输出的范围 一个非常简化的角色限制示例 first name foo 只会返回其记录first name开始于foo 这实际上意味着我已禁止具有该角色的用户查
  • 通过 post 使用 php 发送 XML

    我知道有很多类似的问题 但我尝试过摆弄所有的解决方案 但似乎无法使其发挥作用 我正在尝试将 xml 直接发布到 Web 服务并获得响应 从技术上讲 我正在尝试连接到freightquote com 您可以在右上角找到该文档this http
  • SVG线宽问题

    我开始了我的svg学习 我想用svg线做一些技巧吧 但有件事我不明白 我为每个技能创建 2 行 一行是空的 另一行是知识百分比 问题是 前两行的高度是我给出的笔画宽度的一半 其他线都有很好的高度 这是一个 jsbin http jsbin
  • 只保留 A-Z 0-9 并使用 javascript 从字符串中删除其他字符

    我正在尝试验证字符串以使它们成为有效的网址 我只需要保留 A Z 0 9 并使用以下命令从字符串中删除其他字符javascript or jquery 例如 贝儿餐厅 我需要将其转换为 百丽餐厅 所以字符被删除 只保留 A Z a z 0
  • 如何确保 re.findall() 停止在正确的位置?

    这是我的代码 a import re re findall r lt title gt lt title gt a 结果是 title aaa
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • Matlab strcat 不返回字符串?

    imgstr 无法识别 strcat 的输出字符串 homedir C Users images for img 01 bmp 02 bmp 03 bmp imgstr strcat homedir img I imread imgstr
  • 居中

    我的问题 http i56 tinypic com ff3jmo png http i56 tinypic com ff3jmo png 项目符号点未对齐 我要做的只是 text align center ing ul 所在的类 我可以对齐
  • PHP-如何根据条件配对数组中的项目

    如何将数组中的项目配对 假设我有一个数组Fighters 我想根据他们的情况将他们配对Weights 体重最接近的拳手应作为配对最佳匹配 但如果他们是在同一个团队中 他们不应该配对 团队 1 战斗机A体重为60 战斗机B体重为65 2队 战
  • 使用 Xpath 进行部分匹配

    我正在尝试创建一个搜索功能 允许使用 Xpath 按歌曲标题或流派进行部分匹配 这是我的 XML 文件
  • PHP Json_encode 将空格更改为加号 +

    我有一个网络应用程序 我首先将 JSON 数据存储在 cookie 中 然后每 x 秒保存到数据库 它只是打开与服务器的连接 服务器读取 cookie 它实际上并不通过 POST 或 GET 发送任何内容 当我保存到 cookie 时 我的
  • PHP 中根据相似值对数组进行分组

    我有一个具有以下结构的数组
  • PHP date() 和 strtotime() 返回错误的月份 31 日

    我在用着date and strtotime 函数在下拉列表中显示接下来的 3 个月 PHP代码 echo date m Y strtotime 0 months echo date m Y strtotime 1 months echo
  • 使用 Webmin 设置 cron 作业

    我正在尝试使用 Webmin 设置一个 Cron 作业每 5 分钟运行一次 它需要定位 php 文件并运行该文件中的 php 脚本 当我在 命令 字段中输入文件路径时 它不起作用 我只是想知道我做错了什么 以及我需要 Cron 作业运行的文
  • 使用 Swift 邮件程序发送邮件时出现错误 501

随机推荐