在 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);
}