根据子弹级别将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 标签以使每个标签具有特定的样式
与其提出问题,不如尽力提供帮助,如果没有什么可提供的,请保持原样。
【问题讨论】:
使用不同标签的原因是什么?因为lii
和liii
是无效的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标签替换为不同的标签的主要内容,如果未能解决你的问题,请参考以下文章