问题描述
# 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-child
和 last-child
的 css 等效项,但我必须将它们物理添加到标签中,因为我无法使用 CSS。字符串是 MPDF 文档的一部分,<p>
标签不支持第 n 个子级。
$dom = new DOMDocument();
$question_paragraphs = array();
$dom->loadHTML($q['quiz_question']);
foreach($dom->getElementsByTagName('p') as $node)
{
$question_paragraphs[] = $dom->saveHTML($node);
}
但是一旦我有了那个数组,我就很难找到一种干净的方法来将 first
和 last
类附加到数组的任一端。我最终得到了很多丑陋的循环和数组拼接,感觉非常混乱。
我想知道是否有人有任何巧妙的方法来做到这一点?谢谢:)
编辑注意:这两个字符串在 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);
}