我有一个XML文档:
<items>
<item>
<id>1</id>
<title>Title ABC Defg</title>
<author>Author Name</author>
<description>Description text </description>
</item>
...
</items>
我想做一个serching并检查标题,作者,描述是否包含短语
我不知道如何立即执行此操作并按相关性进行排序。但它并不像搜索“单词”和“单词”那么重要。我使用了php代码:
<?php
$xml=simplexml_load_file(file.xml);
$query=$_GET['query'];
$nodes= $xml->xpath("//item[contains(title,'$query')]");
$count = count($nodes);
for ($i=1;$i<=$count;$i++){
$nodes= $xml->xpath("//item[contains(title,'$query')][$i]");
foreach($nodes as $node) {
$title = $node->title;
$desc= $node->description;
$auth= $node->auth;
$id= $node->id;
echo "id: $id<br />title: $title<br />author: $auth<br />desc: $desc<p> </p>
?>
我知道它只搜索标题,但问题是,当我搜索Word时,它无法找到单词,我想得到两个:单词和单词
如果你也可以帮我“连接”搜索作者的标题和描述,并以某种方式订购,我会真的很适合。
编辑:
我已经设法搜索所有标签(不仅指定,但对我来说没关系)
所以我有这样的代码:
$query=strtolower(rawurldecode($_GET['s']));
$nodes= $xml->xpath("//item[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'$query')]") // . - all i suppose
我还使用$ query
的验证方式答案 0 :(得分:4)
所以你想知道,如何选择包含xpath文本搜索的<items><item>
元素的所有子元素(我将区分大小写,你会在链接的答案中找到它)。首先,所有项目元素:
//items/item
你已经拥有了。要仅返回包含某些文本的内容,请添加谓词:
//items/item[contains(., 'XYZ')]
如果您只想在<title>
子元素中搜索:
//items/item[contains(title, 'XYZ')]
这基本上就是你已经拥有的东西,但是你不必要地努力工作:你不需要做两次,你可以直接迭代匹配:
$nodes = $xml->xpath("//items/item[contains(title, 'XYZ')]");
foreach ($nodes as $node)
{
foreach ($node as $name => $prop) {
printf("%s: %s\n", $name, $prop);
}
echo "\n";
}
输出:
id: 3
title: Title XYZ
author: Author Name
description: Description text
要了解如何将输入转义为xpath(这是只读的,因此这不像SQL注入那样危险),请考虑以下示例:
$query = 'XYZ';
$expression = sprintf("//item[contains(title,'%s')]", $query);
$nodes = $xml->xpath($expression);
它将创建以下表达式:
//item[contains(title,'XYZ')]
但如果那里有一些单引号会怎样?它将终止字符串,因此会产生错误:
$query = 'd\'oh';
会给:
Warning: SimpleXMLElement::xpath(): Invalid expression in ...
您可以通过执行as outline here来阻止此操作,特别是将值分配给文档并进行比较:
$query = 'd\'oh';
$xml['query'] = $query;
$nodes = $xml->xpath("//item[contains(title, /*/@query)]");
旧:您一次提出多个问题:
相关性未定义。与其他人相关的内容可能与其他人无关,因此如果没有关于如何衡量相关性的具体定义,则很难回答问题的这一部分。
对于不区分大小写的搜索,已经链接了重复的问题,因此您应该能够这样做。我眼中最好的第一个傻瓜:
但是在这里它仍然是未定义的情况,更低和更高的情况。你还没有指明一个东西,所以你的问题无法得到真正的回答。
此外,您还没有真正验证您的输入:
$query = $_GET['query'];
$nodes = $xml->xpath("//item[contains(title,'$query')]");
这里可以使用GET参数注入xpath。小心,否则你根本不会做任何搜索。