微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 PHP 中向包含一个或多个 <p> 标签的字符串添加“first”和“last”类

如何解决在 PHP 中向包含一个或多个 <p> 标签的字符串添加“first”和“last”类

我有两个字符串要输出页面

# string 1
<p>paragraph1</p>

# string 2
<p>paragraph1</p>
<p>paragraph2</p>
<p>paragraph3</p>

我想做的是把它们变成这个

# string 1
<p class="first last">paragraph1</p>

# string 2
<p class="first">paragraph1</p>
<p>paragraph2</p>
<p class="last">paragraph3</p>

我基本上是在尝试复制 first-childlast-child 的 css 等效项,但我必须将它们物理添加标签中,因为我无法使用 CSS。字符串是 MPDF 文档的一部分,<p> 标签不支持第 n 个子级。

我可以很容易地遍历字符串以将 <p> 标签拆分为一个数组

$dom = new DOMDocument();
$question_paragraphs = array();
$dom->loadHTML($q['quiz_question']);
foreach($dom->getElementsByTagName('p') as $node)
{
 $question_paragraphs[] = $dom->saveHTML($node);
}

但是一旦我有了那个数组,我就很难找到一种干净的方法来将 firstlast 类附加到数组的任一端。我最终得到了很多丑陋的循环和数组拼接,感觉非常混乱。

我想知道是否有人有任何巧妙的方法来做到这一点?谢谢:)

编辑注意:这两个字符串在 while(array) 循环中输出,因为它们存储在数据库中。

解决方法

您可以使用 item() 方法索引节点列表,因此您可以将属性添加到列表中的第一个和最后一个元素。

$dom = new DOMDocument();
$question_paragraphs = array();
$dom->loadHTML($q['quiz_question']);
$par = $dom->getElementsByTagName('p');
if ($par->length == 1) {
    $par->item(0)->setAttribute("class","first last");
} elseif ($par->length > 1) {
    $par->item(0)->setAttribute("class","first");
    $par->item($par->length - 1)->setAttribute("class","last");
}
    
foreach($par as $node)
{
    $question_paragraphs[] = $dom->saveHTML($node);
}

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