我遇到了一个问题,我在网上找不到任何解决方案。所以问题是我不知道如何使用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());
我怎样才能实现这一目标?
$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();
如果您使用XPath表达式查找所有类属性,这些属性是具有您之后的类的节点的直接后代,则可以将所需文本添加到节点的末尾...
$kaltMieteFinder = new \DOMXPath($doc);
$kaltMieteLists = $kaltMieteFinder->query("//*[contains(@class, 'grid grid-flex')]/*/@class");
foreach ($kaltMieteLists as $key=>$kaltMieteList) {
$kaltMieteList->value .=" unique_".($key+1);
}