将 "first" 和 "last" 类 添加到 PHP 中包含一个或多个 <p> 标记的字符串

Add "first" and "last" classes to strings containing one or more <p> tags in PHP

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

# 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> 标签不支持第 nth-child。

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

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

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

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

编辑注意:这两个字符串在 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);
}