在 html 字符串中拼接 html 标签

如何解决在 html 字符串中拼接 html 标签

我正在使用 htmlagility pack 在开始和结束位置删除 <br> 标记,但以下代码正在从所有位置删除。

HTML 字符串:

 <p><br><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span><br></p>

下面是我删除 br 标签的代码

    using HtmlAgilityPack;

    var document = new HtmlAgilityPack.HtmlDocument();
    document.LoadHtml(input.HTMLString);
    var rootNode = document.DocumentNode;
    var nodes = rootNode.SelectNodes("//br");
    if (nodes != null)
    {
        foreach (var brTag in nodes)
            brTag.Remove();
        this.HTMLString = document.DocumentNode.OuterHtml;
    }

我希望结果字符串看起来像这样

 <p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span></p>

而是在 this.HTMLString 中获取字符串,如下所示

  <p><span>MERV 9 Cartridge<b>&nbsp;</b>Prefilters </span></p>

任何人都可以帮助如何仅在字符串的开头和结尾而不是在字符串之间删除 br 标记,我正在使用 HTMLAgility 包库

解决方法

我不确定您的 HTML 是否总是在 <p> 元素中,或者 <br /> 元素的数量是否因情况而异。如果它没有不同并且您可以依赖于相同的外部元素,您可以使用它来获取第一个和最后一个 <br/> 元素。

选项 #1 - 当父元素(本例中为 p)已知且 br 元素数已知(本例中为 3)时。

string html = "<p><br><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span><br></p>";
string outHtml = string.Empty;

var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);
var rootNode = document.DocumentNode;
var firstBrNode = rootNode.SelectSingleNode("//p/br[1]");
var lastBrNode = rootNode.SelectSingleNode("//p/br[last()]");

firstBrNode?.Remove();
lastBrNode?.Remove();
outHtml = document.DocumentNode.OuterHtml;

输出:

<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span></p>


选项 #2 - 当父元素未知且 br 标签的数量未知时,假设存在一个 br 元素,它将是保留在 HTML 中。

string html = "<p><br><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span><br></p>";
// string html = "<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span></p>";
string outHtml = string.Empty;
var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);
var rootNode = document.DocumentNode;
// count all br nodes so we can bypass removal of br if there is only one in HTML
var brNodeCount = rootNode.SelectNodes("//br") == null ? 0 : rootNode.SelectNodes("//br").Count;
// get the parent node of the br element to be used in the xpath when we remove
// the br elements this will allow for different parent elements other than the `p` element
var parentNode = rootNode.SelectSingleNode("//br/parent::*");
// only removes br elements if more than one in HTML,assumes if 1 br element is present it's in the middle and will not be removed
if (brNodeCount > 1)
{ 
    var firstBrNode = rootNode.SelectSingleNode($"//{parentNode.Name}/br[1]");
    var lastBrNode = rootNode.SelectSingleNode($"//{parentNode.Name}/br[last()]");
    firstBrNode?.Remove();
    lastBrNode?.Remove();
}
outHtml = document.DocumentNode.OuterHtml;

输出:

<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span></p>


选项 #3 - 考虑第一个和最后一个文本节点的索引并删除位于它们“外部”的所有 br 元素。包含空值或全空白值的文本节点将被忽略。

// removes all br tags with an index before the first text node and
// all br tags with an index after the end of the last text node,// any br tags between are not removed
private string RemoveStartAndEndBrTags(string html)
{
    if (string.IsNullOrEmpty(html)) return html;
    var document = new HtmlAgilityPack.HtmlDocument();
    document.LoadHtml(html);
    var rootNode = document.DocumentNode;
    // get first and last text nodes,excluding any only containing white-space
    var allNonEmptyTextNodes = rootNode.SelectNodes("//text()[not(self::text()[not(normalize-space())])]");
    if (allNonEmptyTextNodes == null || allNonEmptyTextNodes.Count == 0) return html;
    var firstTextNode = allNonEmptyTextNodes[0];
    var lastTextNode = allNonEmptyTextNodes[allNonEmptyTextNodes.Count - 1];
    // get the parent node of the first br element,it will be used when we remove the br elements,// this will allow for different parent elements other than the `p` element
    var parentNode = rootNode.SelectSingleNode("//br/parent::*");
    if (parentNode == null) return html;
    var allBrNodes = rootNode.SelectNodes($"//{parentNode.Name}/br");
    foreach (var brNode in allBrNodes)
    {
        if (brNode == null) continue;
        // check index of br nodes against first and last text nodes
        // and remove br nodes that sit outside text nodes
        if (brNode.OuterStartIndex <= firstTextNode.OuterStartIndex
            || brNode.OuterStartIndex >= lastTextNode.OuterStartIndex + lastTextNode.OuterLength)
        { 
            brNode.Remove();
        }
    }
    return document.DocumentNode.OuterHtml;
}

测试 HTML 输入:

<p><br><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span><br></p>
<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span></p>
<p><span>MERV 9 <br>Cartridge<b><br>&nbsp;</b>Prefilters </span></p>
<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters<br> </span></p>
<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters<br></span></p>

测试 HTML 输出:

<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span></p>
<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span></p>
<p><span>MERV 9 <br>Cartridge<b><br>&nbsp;</b>Prefilters </span></p>
<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters </span></p
<p><span>MERV 9 Cartridge<b><br>&nbsp;</b>Prefilters</span></p>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-