2016-06-22 4 views
1

を置き換えます)。このとき DOMElementのは、私は<code>DOMElement</code>このHTML文字列を持つHTML値

は、私のコードは次のようになります。

$node->nodeValue = preg_replace(
    '/(?<replaceable>{{([a-z0-9_]+)}})/mi', '' , $node->nodeValue); 

nodeValueは、ノードのHTML値が含まれていないので、これは動作しません。 $node->C14N()以外のノードのHTML文字列を取得する方法はわかりませんが、C14Nを使用してコンテンツを置き換えることはできません。 このようなHTML文字列で{{test}}をどのように削除することができますか?

答えて

1

DOMDocument::saveXML機能を試しましたか? (http://php.net/manual/en/domdocument.savexml.php

これは、2番目の引数$nodeを持っています。このノードでは、どのノードにHTML/XMLを印刷するかを指定できます。

ので、例えば:

<?php 

$doc = new DOMDocument('1.0'); 
// we want a nice output 
$doc->formatOutput = true; 

$root = $doc->createElement('body'); 
$root = $doc->appendChild($root); 

$title = $doc->createElement('h1', 'Home'); 
$root->appendChild($title); 

$text = $doc->createTextNode('test{{test}}'); 
$text = $root->appendChild($text); 

echo $doc->saveXML($root); 

?> 

これはあなたを与える:

<body> 
    <h1>Home</h1> 
    test{{test}} 
</body> 

をあなたは<body>タグを使用しない場合、あなたは可能性のサイクルをそののchildNodesのすべてを:

<?php 

foreach($root->childNodes as $child){  
    echo $doc->saveXML($child); 
} 

?> 

これはあなたに与えるでしょう:

<h1>Home</h1>test{{test}} 

編集:

<?php 

$xml = ''; 
foreach($root->childNodes as $child){  
    $xml .= preg_replace(
       '/(?<replaceable>{{([a-z0-9_]+)}})/mi', '', 
       $doc->saveXML($child) 
    ); 
} 

?> 

をこれはあなたを与える:

<h1>Home</h1>test 

注:私がテストしていないあなたが、その後の進路がすでに使用している正規表現で{{test}}を置き換えることができますこれはあなたに一般的な考えを与えるはずです。

1

この問題は主にDOMをどのようにナビゲートするかに関係しますが、RegExpにも問題があります。 XPathは、実際にはDOM操作に関して多くの柔軟性を提供します。それが私の好みの解決策です。あなたが特にXPathの中'/div/text()'とその<div>のテキストノードをターゲットにすることができ

$dom = new DOMDocument('1.0', 'utf-8'); 
$xpath = new DOMXPath($dom); 

$node = $dom->createElement('div'); 
$node->appendChild(
    $dom->createElement('h1', "Home") 
    ); 
$node->appendChild(
    $dom->createTextNode("test{{test}}") 
    ); 

$dom->appendChild($node); 

:あなたはDOMDocumentオブジェクトを持っていると仮定すると

は、この(私はXPathを添付しました)のように構築されました。

ので、ノードの残りの部分を破壊することなく、テキストノード内{{test}}を置き換えるために、あなたはどうなる:

$xpath->query('/div/text()')->item(0)->nodeValue = preg_replace(
     '/(.*){{[^}]+}}/m', 
     '$1', 
     $xpath->query('/div/text()')->item(0)->nodeValue 
); 

やや複雑しかし$dom->saveXML();からの出力は次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<div><h1>Home</h1>test</div> 

{{test}}はされています残りの部分はそのまま残す。

+0

現在のところDOMElementノードしか使用できません。domまたはxpathは使用できません。または私は同様にxpathとして子供を読み込む必要があります。 – SheperdOfFire

+0

"ルートノード"を "作成"したDOMDocumentにノードをロードするだけで、元の要素を操作したときに元の要素を抽出することができます。 – CD001

関連する問題