DOMXPath多个包含选择器不工作

DOMXPath多个包含选择器不工作,dom,xpath,domxpath,Dom,Xpath,Domxpath,我有一个XPath查询,一个善良的用户在上面帮了我: $xpath->query(".//*[not(self::textarea or self::select or self::input) and contains(., '{{{')]/text()") as $node) 其目的是用值替换某些占位符,并正确捕获不应替换的事件,如以下事件: <textarea id="testtextarea" name="testtextarea">{{{variable:test}

我有一个XPath查询,一个善良的用户在上面帮了我:

$xpath->query(".//*[not(self::textarea or self::select or self::input) and contains(., '{{{')]/text()") as $node)
其目的是用值替换某些占位符,并正确捕获不应替换的事件,如以下事件:

<textarea id="testtextarea" name="testtextarea">{{{variable:test}}}</textarea>
以及:

我在一些类似的问题上遵循了建议:,我没有收到PHP错误,但是
note editable
标记仍在替换它们的占位符

知道我尝试的查询有什么问题吗

编辑

最小可重复性DOM样品:

<div class="note-editing-area">
    <textarea class="note-codable"></textarea>
    <div class="note-editable panel-body" contenteditable="true" style="height: 350px;">{{{variable:system_url}}</div>
</div>
使用下面的xpath

.//*[not(self::textarea or self::select or self::input or self::div[contains(@class,'note-editable')]) and contains(., '{{{')]

不幸的是,这没有起作用。我的问题被更新为一个最小的可复制DOM片段,以及我的替换代码。提前感谢您的帮助。我已经找到了它不起作用的原因——元素是在页面呈现后通过JS创建的。如果没有这个要求,你的答案是有效的。因此,接受是正确的。
$xpath->query(".//*[not(self::textarea or self::select or self::input or contains(@class, 'note-editable')) and contains(., '{{{')]/text()") as $node)
<div class="note-editing-area">
    <textarea class="note-codable"></textarea>
    <div class="note-editable panel-body" contenteditable="true" style="height: 350px;">{{{variable:system_url}}</div>
</div>
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
foreach ($xpath->query(".//*[not(self::textarea or self::select or self::input or self::div[contains(@class,'note-editable')]) and contains(., '{{{')]/text()") as $node) {
    $node->nodeValue = preg_replace_callback('~{{{([^:]+):([^}]+)}}}~', function($m) use ($placeholders) {
        return $placeholders[$m[1]][$m[2]] ?? '';
    },
    $node->nodeValue);
}
$html = $dom->saveHTML();
echo html_entity_decode($html);
.//*[not(self::textarea or self::select or self::input or self::div[contains(@class,'note-editable')]) and contains(., '{{{')]