2017-12-19 7 views
1

私は問題に遭遇し、私は解決策をオンラインで見つけることができません。だから問題は、私はPHP DOMを持つ特定の子供にクラスを追加する手がかりがないということです。私のHTMLは次のようになります:特定の子供を選択してクラスを追加するPHP DOM

<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> 

私が望むのは、すべての "グリッドグリッドフレックス"の子供にユニークなクラスを与えることです。つまり、すべての「グリッド項目の結果エントリ」に追加の一意のクラスが必要です。例えば、このような何か:

<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()); 

は、どのように私はそれを達成することができますか?

答えて

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

+0

ありがとうございました。これは完全に機能しました。乾杯。 –

+0

喜んで助けてください。がんばろう! – splash58

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); 
} 
関連する問題