Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php xpath匹配第一个子项和最后一个子项_Php_Html_Xpath - Fatal编程技术网

Php xpath匹配第一个子项和最后一个子项

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>

尝试确定任何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>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()])]