PHP DOM通过选择特定的子项来添加类

问题描述 投票:1回答:2

我遇到了一个问题,我在网上找不到任何解决方案。所以问题是我不知道如何使用PHP DOM将类添加到特定的子类。我的HTML看起来像这样:

<div class="grid grid-flex gutters-horizontal">
 <dl class="grid-item result-entry">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
 <dl class="grid-item result-entry">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
 <dl class="grid-item result-entry">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
</div>

<div class="grid grid-flex gutters-horizontal">
 <dl class="grid-item result-entry">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
 <dl class="grid-item result-entry">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
 <dl class="grid-item result-entry">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
</div>

现在我想要的是给每个“grid grid-flex”的孩子一个独特的课程。这意味着每个“网格项结果条目”都应该有一个额外的唯一类。例如这样的事情:

<div class="grid grid-flex gutters-horizontal">
 <dl class="grid-item result-entry unique_1">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
 <dl class="grid-item result-entry unique_2">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
 <dl class="grid-item result-entry unique_3">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
</div>

<div class="grid grid-flex gutters-horizontal">
 <dl class="grid-item result-entry unique_1">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
 <dl class="grid-item result-entry unique_2">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
 <dl class="grid-item result-entry unique_3">
   <dd class="font-nowrap font-line">Foo</dd>
   <dt class="font-s onlyLarge">Foo</dt>
 </dl>
</div>

我的代码现在看起来像这样:

$kaltMieteFinder = new \DOMXPath($doc);
$kaltMieteLists = $kaltMieteFinder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $findKaltMiete ')]");
$findingkaltMiete = new \DOMDocument(); 

foreach ($kaltMieteLists as $kaltMieteList) {
 $findingkaltMiete->appendChild($findingkaltMiete->importNode($kaltMieteList,true));
}
$mieteHTML.=trim($findingkaltMiete->saveHTML()); 

我怎样才能实现这一目标?

php dom children
2个回答
2
投票
$doc = new DomDocument();
$doc->loadHTML($s);
$findKaltMiete = 'grid-flex';
$nextStep = 'grid-item';
$kaltMieteFinder = new \DOMXPath($doc);
$kaltMieteLists = $kaltMieteFinder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $findKaltMiete ')]");

foreach ($kaltMieteLists as $kaltMieteList) {
   // Start value for unique class
   $i = 1;
   // Select  child 'grid-item' tags
   $items = $kaltMieteFinder->query(".//*[contains(concat(' ', normalize-space(@class), ' '), ' $nextStep ')]", $kaltMieteList);
   foreach($items as $x) {
     // append new class for existing value 
     $x->setAttribute('class',  $x->getAttribute('class') . ' unique' .$i++);
   }
}
echo $doc->saveHTML(); 

demo


1
投票

如果您使用XPath表达式查找所有类属性,这些属性是具有您之后的类的节点的直接后代,则可以将所需文本添加到节点的末尾...

$kaltMieteFinder = new \DOMXPath($doc);
$kaltMieteLists = $kaltMieteFinder->query("//*[contains(@class, 'grid grid-flex')]/*/@class");

foreach ($kaltMieteLists as $key=>$kaltMieteList) {
    $kaltMieteList->value .=" unique_".($key+1);
}
© www.soinside.com 2019 - 2024. All rights reserved.