Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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_Xpath - Fatal编程技术网

Php xpath:排除作为属性值一部分的文本

Php xpath:排除作为属性值一部分的文本,php,xpath,Php,Xpath,我需要解析一块寻找特定术语的html,并将该术语的所有实例包装在一个标记中(使用类“keyword”) 为此,我使用xpath解析html位,它运行良好 $nodes = $xpath->query('//text()[contains(., "CLEA")]'); 除非在某些罕见的情况下,术语位于属性值内,在这种情况下,会发生一些递归,html会中断: Hello <a class="tag" title="this is <a class="tag" href="#"&g

我需要解析一块寻找特定术语的html,并将该术语的所有实例包装在一个标记中(使用类“keyword”)

为此,我使用xpath解析html位,它运行良好

$nodes = $xpath->query('//text()[contains(., "CLEA")]');
除非在某些罕见的情况下,术语位于属性值内,在这种情况下,会发生一些递归,html会中断:

Hello <a class="tag" title="this is <a class="tag" href="#">CLEA</a>">CLEA</a>, hello!
你好“>克莱,你好!
当我想要的是

Hello <a class="tag" title="this is CLEA">CLEA</a>, hello!
你好 14.01 - 19.01.2013 地址: 法兰西朱蒙广场 主办单位: 德拉克,北加莱帕斯酒店 北加莱国家教育局 在以下方面: 克莱,瑞斯登斯任务 地方教育艺术合同 http://cleavaldesambre.wordpress.com/ 与:Martin Mey、Stephane Querrec、Woudi Tat、Marie Morel、LAb[au] 实验室[au]特色项目:,动感灯光艺术装置 ,控制论灯光艺术装置

更新2 xpath在php中的使用方式如下

    $dom = new DOMDocument('1.0', 'utf8');
    $dom->formatOutput = true;
    $dom->loadHTML(mb_convert_encoding($text, 'HTML-ENTITIES', 'UTF-8'));
    $xpath = new DOMXPath($dom);
    foreach ($tags as $t) {
        $label = $t['label'];
        $nodes = $xpath->query('//text()[contains(., "' . $label . '")]');
        $urlVersion = htmlentities(urlencode($label));

        foreach ($nodes as $node) {
            $link = '<a class="tag" rel="tag-definition" title="Click to know more about ' . $label . '" href="?tag='.$urlVersion.'">'.$label.'</a>';
            $replaced = str_replace($label, $link, $node->textContent);
            $newNode = $dom->createDocumentFragment();
            $newNode->appendChild(new DOMText($replaced));
            $node->parentNode->replaceChild($newNode, $node);
        }
    }

    $text= $dom->saveHTML();
$dom=newdomdocument('1.0','utf8');
$dom->formatOutput=true;
$dom->loadHTML(mb_convert_编码($text,'HTML-ENTITIES','UTF-8');
$xpath=newdomxpath($dom);
foreach($t标记){
$label=$t['label'];
$nodes=$xpath->query('//text()[包含(,“'.$label.''”));
$urlVersion=htmlentities(urlencode($label));
foreach($node作为$node){
$link='';
$replaced=str_replace($label,$link,$node->textContent);
$newNode=$dom->createDocumentFragment();
$newNode->appendChild(新的DOMText($replaced));
$node->parentNode->replaceChild($newNode,$node);
}
}
$text=$dom->saveHTML();

出现此错误的原因是一个标记是“les amis de CLEA”,另一个标记是“CLEA”。

该表达式不应返回属性值。这看起来像是PHP XPath实现中的错误。在XPath中,
/
/substant或self::node()/
的缩写。子体不包含属性。即使它们包含属性,也不包含
text()不带轴的
是子::text()的缩写,属性没有子节点

因此,您需要一种变通方法。您使用的完全扩展表达式是
/genderant或self::node()/child::text()[包含(,“CLEA”)]
。因此,让我们尝试调整它。而不是
node()
,尝试
*
,它只匹配元素:

/descendant-or-self::*/text()[contains(., "CLEA")]
或者尝试直接在
子体或self
轴上使用
text()
节点测试:

/descendant-or-self::text()[contains(., "CLEA")]

该表达式不应返回属性值。这看起来像是PHP XPath实现中的错误。在XPath中,
/
/substant或self::node()/
的缩写。子体不包含属性。即使包含属性,没有轴的
text()
也是
child::text()的缩写
,属性没有子节点

因此,您需要一种变通方法。您使用的完全扩展表达式是
/genderant或self::node()/child::text()[包含(,“CLEA”)]
。因此,让我们尝试调整它。而不是
node()
,尝试
*
,它只匹配元素:

/descendant-or-self::*/text()[contains(., "CLEA")]
或者尝试直接在
子体或self
轴上使用
text()
节点测试:

/descendant-or-self::text()[contains(., "CLEA")]

这是无效的html。甚至格式不正确。不要期望xpath可以处理这一问题。这只是为了说明我的问题。xpath查询可以处理提供的html,除非在少数情况下如前所述。我真的很想帮助您,但您必须承认这是格式不正确的html。您的查询可能与domdocument一样工作uch对格式不正确的xml很宽容。但是没有办法用xpath选择格式不正确的节点。顺便说一句,你能再多展示一点文档和查询吗?根据你的要求,我已经添加了系统生成的html的原始副本,并发送到xpath。谢谢。嗯,你发布的html看起来格式很好d、 似乎,您看到的问题只发生在某些请求上,但根本没有发生?这是无效的html。甚至格式不正确。不要期望xpath可以处理此问题。这只是为了说明我的问题。xpath查询可以处理提供的html,除非在少数情况下如前所述。我真的很想帮助您,但您需要st承认这是格式不正确的html。当涉及格式不正确的xml时,您的查询可能会像domdocument一样工作。但是没有办法用xpath选择格式不正确的节点。顺便说一句,您能再多显示一点文档和查询吗?根据您的请求,我已经添加了生成的html的原始副本通过系统并发送到xpath。谢谢。嗯,您发布的html看起来格式良好。似乎,您看到的问题只发生在某些请求上,但根本不会发生?谢谢您的建议。我尝试了这些建议,但不幸的是,您的两个建议都出现了相同的问题。尽管如此,它们仍然有效,因为所有其他情况仍然有效。谢谢你的建议。我试过了,但不幸的是,你的两个建议都出现了同样的问题。尽管如此,它们是有效的,因为所有其他案例仍然有效。