DOMXPath 多个包含选择器不起作用

DOMXPath multiple contain selectors not working

我有以下 XPath 查询,SO 上的好心用户帮助我解决了这个问题:

$xpath->query(".//*[not(self::textarea or self::select or self::input) and contains(., '{{{')]/text()") as $node)

它的目的是用一个值替换某些占位符,并正确捕获如下不应替换的事件:

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

并正确替换这样的事件:

<div>{{{variable:test}}}</div>

现在我想排除在该查询中包含 class 名称 note-editable<div> 类型的元素,例如 <div class="note-editable mayhaveanotherclasstoo">,以及文本区域, 选择或输入。

我试过了:

$xpath->query(".//*[not(self::textarea or self::select or self::input) and not(contains(@class, 'note-editable')) and contains(., '{{{')]/text()") as $node)

和:

$xpath->query(".//*[not(self::textarea or self::select or self::input or contains(@class, 'note-editable')) and contains(., '{{{')]/text()") as $node)

我遵循了一些类似问题的建议:PHP xpath contains class and does not contain class,我没有收到 PHP 错误,但 note-editable <div> 标签仍​​然存在替换了他们的占位符。

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

编辑

最小可重现性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>

进行替换的代码:

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

在 xpath 下使用这个。

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