根据子弹级别将li标签替换为不同的标签

Posted

技术标签:

【中文标题】根据子弹级别将li标签替换为不同的标签【英文标题】:replace li tag with different tag according to the bullet level 【发布时间】:2021-09-07 23:57:27 【问题描述】:

需要根据子弹级别将li标签替换为不同的自定义标签,对于li level1保持原样,对于level2将li改为lii,对于level3将li改为liiii

例如对于下面的输入(我在下面的代码中只有 2 个项目符号级别作为示例)

<p><strong>Basics to Macros & VBA Code</strong></p>
<ul>
<li>Create a Macro MsgBox
<ul>
<li>test</li>
<li>test 1</li>
</ul>
</li>
<li>Workbook and Worksheet</li>
<li>Object Range</li>
<li>Object Variables</li>
<li>If Then Statement</li>
<li>Loop</li>
<li>Macro Errors</li>
<li>String Manipulation</li>
<li>Date and Time</li>
<li>Events</li>
<li>Array</li>
<li>Function and Sub</li>
<li>Application Object</li>
<li>Final Project</li>
</ul>

想要的输出

<p><strong>Basics to Macros & VBA Code</strong></p>
<ul>
<li>Create a Macro MsgBox
<ul>
<lii>test</lii>
<lii>test 1</lii>
</ul>
</li>
<li>Workbook and Worksheet</li>
<li>Object Range</li>
<li>Object Variables</li>
<li>If Then Statement</li>
<li>Loop</li>
<li>Macro Errors</li>
<li>String Manipulation</li>
<li>Date and Time</li>
<li>Events</li>
<li>Array</li>
<li>Function and Sub</li>
<li>Application Object</li>
<li>Final Project</li>
</ul>

如您所见,代码应该只更改 2 行(因为它是第 2 级)并保持 li 级别 1 原样

<lii>test</lii>
<lii>test 1</lii>

我在 php 中的代码

function clean($str)
   
    $level = 0;
    $str_temp = $str;
    //$pos = strpos($str,"<ul>");
    $str1 = "";
    foreach(preg_split("/((\r?\n)|(\r\n?))/", $str_temp) as $line)
        $line1 = "";
        if(strpos($line,"<ul>"))
            $level++;
        elseif(strpos($line,"</ul>"))
            $level--;
        
                
        if(level == 2)
            $str1 .= str_replace("<li>", "<lii>", $line1);
        elseif(level == 3)
            $str1 .= str_replace("<li>", "<liii>", $line1);
        else
            $str1 .= $line1;
        
     

    $str1 = trim($str1);
    return $str1;

更新

1- html 代码由 tinymce 创建并存储在 DB 中 2-我正在使用 FPDF 将 DB 输出为 PDF 文件 3-我正在使用 FPDF 的特定库来解析 html 标签以使每个标签具有特定的样式

与其提出问题,不如尽力提供帮助,如果没有什么可提供的,请保持原样。

【问题讨论】:

使用不同标签的原因是什么?因为liiliii 是无效的HTML 标签。 如果您需要特定的样式,为什么不使用类?或者只是嵌套选择器ul ul li (我已经删除了问题中的 javascript 和 CSS 标签,以帮助将其磨练给合适的受众。并赞成它,因为我认为这个问题没有任何问题。) 我也投了赞成票,因为现在有一个关于为什么需要实现这一点的描述,它作为一个问题要清楚得多。 你看过 PHP 的 DomDocument 吗? 【参考方案1】:

我查看了我的代码,现在它运行良好,出于 FPDF - witetag 库的目的,我删除了 UL 标签并在行尾关闭了每个 li 标签,保持其他标签不变。

function clean($str)
   
    $str1 = "";
    $level = 0;
    foreach(preg_split("/((\r?\n)|(\r\n?))/", $str) as $line)
        if(strpos($line,"<ul>") !== false )
            $level++;
        elseif(strpos($line,"</ul>")!== false)
            $level--;
        
        
        if(strpos($line,"<li>")!== false)
            if(strpos($line,"</li>")=== false)
                $line = $line . "</li>";
            
        elseif(strpos($line,"</li>")!== false)
            $line = str_replace("</li>", "", $line);
        else
            $line= $line;
        
        
        if($level == 2)
            $line = str_replace("<li>", "<lii>", $line);
            $line = str_replace("</li>", "</lii>", $line);
            $str1 .=  $line;
        elseif($level == 3)
            $line = str_replace("<li>", "<liii>", $line);
            $line = str_replace("</li>", "</liii>", $line);
            $str1 .=  $line;
        else
            $str1 .= $line;
        
        

     

    $str1 = str_replace("<ul>", "", $str1);
    $str1 = str_replace("</ul>", "", $str1);

    $str1 = trim($str1);
    return $str1;

【讨论】:

以上是关于根据子弹级别将li标签替换为不同的标签的主要内容,如果未能解决你的问题,请参考以下文章

列表标签

多个 (li) 标签如何获取获取选中的里面的某个特定值??

多个 (li) 标签如何获取获取选中的里面的某个特定值

常用的HTML标签

怎么将ul下的li标签横着排列,要设置那个属性?

<li>标签中怎么设置文字居中对齐?