我有一个这样的 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";
但是,使用这种技术,用户必须搜索“Chicago”而不是“chicago”,否则搜索将不会返回任何结果。
我知道我需要使用翻译功能,但我所有的尝试和错误都是徒劳的。
我试过:
$upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$lower = "abcdefghijklmnopqrstuvwxyz";
$kw = $xml->xpath("line[contains(text(),'translate('$keyword','$upper','$lower'))]");
但似乎没有任何效果。有小费吗?
最佳答案
Gordon 建议在 XPath 中使用 PHP 函数,如果您选择使用它,将会证明它更加灵活。然而,与他的回答相反,translate字符串函数在在 XPath 1.0 中可用,这意味着您可以使用它;你的问题是如何。
首先,Charles 在对问题的评论中指出了明显的拼写错误。然后是您如何尝试匹配文本值的逻辑。
在单词形式中,您目前在问“文本是否包含关键字的小写形式?”这并不是您真正想问的。相反,问“小写文本是否包含小写关键字?”将其翻译回 XPath 领域(请原谅双关语)将是:
(注意:为了便于阅读截断字母)
//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> 上的一个属性使访问它变得 super 容易的元素。使用 SimpleXML 有两种方法可以访问它:$node['number']或 $node->attributes()->number (我更喜欢前者)。
第 number - 正如您所说的那样,要做到这一点,我们需要向上遍历树。如果我们使用 DOM 类,我们将有一个方便的 $node->parentNode属性(property)将我们直接带到<chapter> (因为它是我们 <line> 的直接祖先)。 SimpleXML 没有这样一个方便的属性,但我们可以使用相对 XPath 查询来获取它。 parent axis允许我们向上遍历树。
自 xpath()返回一个数组,我们可以作弊并使用 current()访问从它返回的数组中的第一个(也是唯一一个)项目。那么这只是访问 number 的问题属性如上。
// In the near future we can use: current(...)['number'] but not yet
$chapter = current($node->xpath('./parent::chapter'))->attributes()->number;
书名 -- 此过程与访问章节编号的过程相同。来自 <line> 的相对 XPath 查询可以利用 ancestor axis喜欢./ancestor::book (或 ./parent:chapter/parent::book )。希望你能弄清楚如何访问它的 name属性。
关于php - 在 php 中不区分大小写的 xpath 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3238989/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是rubygems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和rubygems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko
我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/
我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}
我读了"BingSearchAPI-QuickStart"但我不知道如何在Ruby中发出这个http请求(Weary)如何在Ruby中翻译“Stream_context_create()”?这是什么意思?"BingSearchAPI-QuickStart"我想使用RubySDK,但我发现那些已被弃用前(Rbing)https://github.com/mikedemers/rbing您知道Bing搜索API的最新包装器(仅限Web的结果)吗? 最佳答案 好吧,经过一个小时的挫折,我想出了一个办法来做到这一点。这段代码很糟糕,因为它是