1

私はこのHTML文字列をに持っていますDOMElement:

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

このコンテンツを次の方法で置き換えたい

<h1>Home</h1>
test

残ります(したがって、削除したい{{test}})。

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

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

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

4

2 に答える 2

1

問題は主に DOM をナビゲートする方法に関するものですが、RegExp にも問題があります。実際、XPath は DOM 操作に関して多くの柔軟性を提供するので、それが私の好みのソリューションです。

次のように構築された DOMDocument があると仮定します (XPath を添付しました)。

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

XPath<div>でそのテキスト ノードを具体的にターゲットにすることができます。'/div/text()'

{{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}}残りはそのまま残して削除されました。

于 2016-06-22T10:47:24.613 に答える