【问题标题】:replace li tag with different tag according to the bullet level根据子弹级别将li标签替换为不同的标签
【发布时间】: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 吗?

标签: php html dom


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 2015-03-26
    • 2018-11-08
    • 2020-12-05
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多