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(., '{{{')]
我有以下 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(., '{{{')]