2017-08-12 19 views
0

段落内のすべてのテキストノードを反復処理する方法を教えてください。結局のところ、彼らは2-3レベルにすることができます。XPath:すべてのテキストノードを反復処理する方法は?

たとえば、次の段落を取る:

<p>Lorem <i>ipsum dolor</i> sit <span>amet, <b><i>consectetur</i> adipisicing</b> elit</span>. Odit, sunt?</p> 

は、あなたは、すべてのテキストノードを処理し、その場所にそれらを返すようにしたいです。

$content = '<p>Lorem <i>ipsum dolor</i> sit <span>amet, <b><i>consectetur</i> adipisicing</b> elit</span>. Odit, sunt?</p>'; 

$html = new DOMDocument(); 
$html->loadHTML($content); 

$xpath = new DOMXpath($html); 

$elements = $xpath->query('//descendant-or-self::p//node()'); 

    // My processor (not working...) 

    foreach ($elements as $element) { 

    // Processed, only text nodes (not working...) 
    if ($element->nodeType == 3) { 
     function() { 
     return $element->nodeValue = '<span style="background-color: yellow;">' . $element->nodeValue . '</span>'; 
     } 
    } 
    // return to the place 
    echo $element->C14N(); 

    } 

あなたは、このような結果を取得する必要があります:

<p> 
<span style="background-color: yellow;">Lorem </span> 
<i> 
<span style="background-color: yellow;">ipsum dolor</span> 
</i> 
<span style="background-color: yellow;">sit </span> 
<span> 
<span style="background-color: yellow;">amet, </span> 
<b><i> 
<span style="background-color: yellow;">consectetur</span> 
</i> 
<span style="background-color: yellow;">adipisicing</span> 
</b> 
<span style="background-color: yellow;">elit</span> 
</span> 
<span style="background-color: yellow;">. Odit, sunt?</span> 
</p> 
+0

あなたの問題を明確にすることはできますか?既にあなたは段落を繰り返しているようです。では何が効いていないのですか?どのような出力を期待していますか? – Gordon

+0

私はすべてのテキストノードを処理し、すべての場所にそれらを返す必要があります。ええと? –

+1

あなたが何を求めているのか分からないので、私が知っているか分かりません。何を試したのか、なぜこれがうまくいかないのか、あなたの質問を更新してください。次に、予想される結果を追加します。 – Gordon

答えて

1

これは、スパン要素にすべてのテキストノードをラップします:

$content = '<p>Lorem <i>ipsum dolor</i> sit <span>amet, <b><i>consectetur</i> adipisicing</b> elit</span>. Odit, sunt?</p>'; 

$html = new DOMDocument(); 
$html->loadHTML($content); 

$xpath = new DOMXpath($html); 

$elements = $xpath->query('//descendant-or-self::p//text()'); 
/* @var DomNode $element*/ 
foreach ($elements as $element) { 
    $span = $html->createElement("span", $element->nodeValue); 
    $span->setAttribute("style", "background-color: yellow;"); 
    $element->parentNode->replaceChild($span, $element); 
} 

echo $html->saveHTML(); 
関連する問題