Php xpath匹配第一个子项和最后一个子项
尝试确定任何p标记文本是否完全在强/B标记内Php xpath匹配第一个子项和最后一个子项,php,html,xpath,Php,Html,Xpath,尝试确定任何p标记文本是否完全在强/B标记内 // Match (unacceptable, flag to user): <p><strong>Any text and <span>maybe</span> other <em>tags</em></strong></p> // Don't match (acceptable): <p>Any text and <strong>
// Match (unacceptable, flag to user):
<p><strong>Any text and <span>maybe</span> other <em>tags</em></strong></p>
// Don't match (acceptable):
<p>Any text and <strong>maybe</strong> other <em>tags</em></p>
//匹配(不可接受,标记为用户):
任何文本和可能的其他标签
//不匹配(可接受):
任何文本和可能其他标记
以下代码检查p标记在任何强标记前后是否不包含文本或其他HTML标记,确定p标记完全为粗体(Strong)
这里有一种方法,部分基于@gangabass的建议。它统计只包含单个
元素的
元素,这些元素可选地仅由空白文本包围
$unacceptableNodesCount=$xpath->evaluate('count(//p[count(*)=1和name(*)=“strong”和normalize-space()=string(strong)]);
var_转储($unacceptableNodesCount);
不过,老实说,如果目标是防止用户仅使用粗体文本,并且用户已经下定决心,那么他们可能会找到一种方法。例如,在
元素周围使用Unicode空格字符或类似字符。您的问题描述表明您还希望捕获
<p><strong>Builder's</strong><strong> tea</strong></p>
<p><emph><strong>Builder's</strong> <strong> tea</strong></emph></p>
它选择所有不具有非白色子体文本节点的p元素,该文本节点不是p中强元素的子体
我无法立即在XPath 1.0中找到实现这一点的方法,但我的XPath 1.0已经非常过时了。- 任何
..p
//p
- 至少有一个
子节点…strong
//p[.//strong]
- 除了空白之外还有一些文本内容…
//p[.//strong[规范化空间(.!=“”)]
- 并且没有包含没有
祖先节点的内容的文本节点后代:strong
//p[ .//strong[规范化空间(.)!=“”]和 not(.//text()[规范化空间(.!=“”和not(祖先::强)]) ]
strong
内,而没有实际内容不在strong
内,换句话说,内容的格式不同
例如:
$html=loadHTML($html);
$xpath=newdomxpath($document);
$expression=
'//p[
.//strong[规范化空间(.)!=“”]和
not(.//text()[规范化空间(.!=“”和not(祖先::强)])
]';
foreach($xpath->evaluate($expression)作为$p){
瓦鲁垃圾场(
$document->saveXml($p)
);
}
输出:
string(75)”任何文本,可能还有其他标记
串(54)“建筑商的茶”
字符串(64)“Builder'stea”
该表达式也可以扩展为包含b
:
//p[
(
.//strong[规范化空间(.)!=“”]或
.//b[规范化空间(.)!=“”]
)及
不是(
.//text()[
规范化空间(.)!=“”和
不是(祖先::*[self::strong或self::b])
]
)
]
你可以比较string(//p)
和string(//p/strong)
虽然这个代码片段可以解决这个问题,但确实有助于提高你文章的质量。请记住,您将在将来为读者回答这个问题,而这些人可能不知道您的代码建议的原因。这并不是由用户决定的。相反,通常是懒惰(或不知道)。Web CMS使用TinyMCE文本编辑器。用户从Word文档粘贴内容,实际上不使用正确的标题标记,而是使用粗体文本作为标题。我正在为给定的文本编写SEO报告。标记用户应使用TinyMCE编辑器提供的正确标题样式,而不是粗体段落。当然,在一个段落中用一小段粗体字是可以接受的。
<p><strong>Builder's</strong> <strong>tea</strong></p>
<p><emph><strong>Builder's</strong> <strong> tea</strong></emph></p>
//p[empty(.//text()[normalize-space()] except .//strong//text()])]