我有一个像这样的xml文件:
<volume name="Early">
<book name="School Years">
<chapter number="1">
<line number="1">Here's the first line with Chicago in it.</line>
<line number="2">Here's a line that talks about Atlanta</line>
<line number="3">Here's a line that says chicagogo </line>
</chapter>
</book>
</volume>
我正在尝试使用PHP进行简单的关键字搜索,以查找单词并显示其所在的行。
$xml = simplexml_load_file($data);
$keyword = $_GET['keyword'];
$kw=$xml->xpath("//line[contains(text(),'$keyword')]");
...snip...
echo $kw[0]." is the first returned item";
但是,使用此技术,用户 必须 搜索“芝加哥”而不是“芝加哥”,否则搜索将不会返回任何内容。
我了解我需要使用翻译功能,但是我所有的尝试和错误都是徒劳的。
我试过了:
$upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$lower = "abcdefghijklmnopqrstuvwxyz";
$kw = $xml->xpath("line[contains(text(),'translate('$keyword','$upper','$lower'))]");
但似乎没有任何效果。有小费吗?
如果您选择使用Gordon在XPath中使用PHP函数的建议,将会更加灵活。然而,出乎他的回答中,translate
字符串函数 是 XPath
1.0中可用,因此,这意味着你可以使用它; 你的问题是 如何 。
首先,查尔斯在对问题的评论中指出了明显的错别字。然后是您尝试匹配文本值的逻辑。
在单词形式中,您当前正在问:“ 文本是否包含关键字的小写形式? ”这并不是您真正要问的。相反,问:“ 小写文本是否包含小写关键字?
”将其翻译回XPath-land(请原谅):
(注意:为了便于阅读,截断了字母)
//line[contains(translate(text(),'ABC...Z','abc...z'),'chicago')]
上面的小写字母包含在line
节点内的文本,然后检查它(小写字母的文本)是否包含关键字chicago
。
现在是强制性代码片段(但实际上,上面的 想法 是您真正需要带回家的东西):
$xml = simplexml_load_file($data);
$search = strtolower($keyword);
$nodes = $xml->xpath("//line[contains(translate(text(), 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '$search')]");
echo 'Got ' . count($nodes) . ' matches!' . PHP_EOL;
foreach ($nodes as $node){
echo $node . PHP_EOL;
}
在 第戎评论后编辑
在foreach中,您可以访问行号,章号和书名,如下所示。
行号
-这只是<line>
元素上的一个属性,使访问它变得非常容易。使用SimpleXML,有两种方法可以访问它:$node['number']
或$node->attributes()->number
(我更喜欢前者)。
章节编号
-要做到这一点,正如您正确地说的那样,我们需要遍历树。如果我们使用DOM类,我们将拥有一个方便的$node->parentNode
属性,可直接将我们引向<chapter>
(因为它是我们的直接祖先<line>
)。SimpleXML没有这种方便的属性,但是我们可以使用相对的XPath查询来获取它。该父轴允许我们遍历了树。
由于xpath()
返回数组,我们可以作弊并current()
用来访问从数组返回的数组中的第一个(也是唯一的)项目。然后,只需访问上述number
属性即可。
// In the near future we can use: current(...)['number'] but not yet
$chapter = current($node->xpath('./parent::chapter'))->attributes()->number;
书籍名称
-这样做的过程与访问章号的过程相同。来自的相对XPath查询<line>
可以利用祖先轴,例如./ancestor::book
(或./parent:chapter/parent::book
)。希望您能弄清楚如何访问其name
属性。
问题内容: 我有一个Lucene索引,该索引当前区分大小写。我想添加的 选项 有不区分大小写作为后备的。这意味着与案例匹配的结果将获得更大的权重,并且将首先出现。例如,如果结果数限制为10,并且有10个匹配项符合我的情况,那就足够了。如果仅找到7个结果,则可以从不区分大小写的搜索中再添加3个结果。 我的案子实际上更复杂,因为我有不同重量的物品。理想情况下,匹配“错误”的表壳会增加一些重量。不用说,
问题内容: 我正在尝试使用JavaScript中的两个字符串进行不区分大小写的搜索。 通常情况如下: 该标志将不区分大小写。 但是我需要搜索第二个字符串。没有标志,它可以完美地工作: 如果我在上面的示例中添加标志,它将搜索searchstring而不是变量“ searchstring”中的内容(下一个示例不起作用): 我该如何实现? 问题答案: 是的,使用而不是。调用的结果将返回匹配自身的实际字符
问题内容: 和其他比较运算符等的默认行为区分大小写。 是否可以使它们不区分大小写? 问题答案: 从10gR2开始,Oracle允许通过设置和会话参数来微调字符串比较的行为: 您还可以创建不区分大小写的索引: 该信息来自Oracle不区分大小写的搜索。文章提到了,但似乎也适用于旧版本。 在10gR2之前的版本中,这实际上是做不到的,如果不需要 区分重音符号的 搜索,通常的方法是只对列和搜索表达式都使
问题内容: 我尝试在elasticsearch.yml文件中创建一个条目,以针对要点中提到的内容创建自定义分析器: https //gist.github.com/1403902 但我得到以下错误 我仍然不知道如何做到这一点。我已经在stackoverflow上搜索了相同的内容,并得到了类似的回复(如上述要点所述) 请给我一个例子,我可以测试。 问题答案: 由于配置文件在启动时是只读的,因此要使更
本文向大家介绍在Mongo中区分大小写的搜索?,包括了在Mongo中区分大小写的搜索?的使用技巧和注意事项,需要的朋友参考一下 您可以在“ $regex”的帮助下限制MongoDB中不区分大小写的搜索。语法如下- 您可以使用其他正则表达式。语法如下- 为了理解这个概念,让我们用文档创建一个集合。使用文档创建集合的查询如下- 在method的帮助下显示集合中的所有文档。查询如下- 以下是输出- 如果
我有一本区分大小写的字典, 所以我可以在这本字典里找到区分大小写的键。 例如,我可以有下面的键值对, {test,10} {测试,20} {test1,30} {test2,40} ... 当有人传递密钥时,我想检索该值。检索应该部分不区分大小写,这意味着,如果匹配准确的大小写,则返回区分大小写的结果,如果区分大小写的键不存在,则检索区分大小写的键值。 例如,在字典中插入上述值 如果用户通过“测试