Php xpath:排除作为属性值一部分的文本
我需要解析一块寻找特定术语的html,并将该术语的所有实例包装在一个标记中(使用类“keyword”) 为此,我使用xpath解析html位,它运行良好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
$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看起来格式良好。似乎,您看到的问题只发生在某些请求上,但根本不会发生?谢谢您的建议。我尝试了这些建议,但不幸的是,您的两个建议都出现了相同的问题。尽管如此,它们仍然有效,因为所有其他情况仍然有效。谢谢你的建议。我试过了,但不幸的是,你的两个建议都出现了同样的问题。尽管如此,它们是有效的,因为所有其他案例仍然有效。