2017-12-19 14 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()); 

어떻게 그것을 달성 할 수 있는가? 당신은 클래스 귀하의 후와 노드의 직접적인 후손 클래스의 모든 속성을 찾기 위해 XPath 식을 사용하는 경우

답변

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

, 당신은 ... 노드의 마지막에 필요한 텍스트를 추가 할 수 있습니다

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

foreach ($kaltMieteLists as $key=>$kaltMieteList) { 
    $kaltMieteList->value .=" unique_".($key+1); 
}