Php 从foreach循环获取所需元素
我使用下面的代码从amazon上获取一些数据Php 从foreach循环获取所需元素,php,regex,arrays,xpath,Php,Regex,Arrays,Xpath,我使用下面的代码从amazon上获取一些数据 $nodelist = $xpath_cat->query('//li[@id="SalesRank"]/text()'); foreach ($nodelist as $node) { $nodearr[] = trim($node->textContent); } var_dump($nodearr); 并转储结果,输出为 array 0 => string '' (length=0) 1 =>
$nodelist = $xpath_cat->query('//li[@id="SalesRank"]/text()');
foreach ($nodelist as $node) {
$nodearr[] = trim($node->textContent);
}
var_dump($nodearr);
并转储结果,输出为
array
0 => string '' (length=0)
1 => string '#14,000 Paid in Kindle Store (' (length=30)
2 => string ')' (length=1)
3 => string '' (length=0)
4 => string '#21,322 Paid in Kindle Store (' (length=30)
5 => string ')' (length=1)
6 => string '' (length=0)
7 => string '#20,957 Paid in Kindle Store (' (length=30)
8 => string ')' (length=1)
所需的是数组中元素2的#部分
#"#20,957 Paid in Kindle Store"
如何修改代码以获得我的输出?我本来想使用unset()
,但在实现它时我感到困惑。还有一个“(”也需要从字符串中删除
请引导我……我如何修改我的代码?这似乎很简单
看来公认的答案使用了:
substring-before(normalize-space(/html/body//ul/li[@id="SalesRank"]/b[1]/following-sibling::text()[1])," ")
还显示了其他一些不错的选项。您可以稍微调整xpath查询,但也可以使用它来过滤数组。例如:
array_filter($data, function($e) {return $e[0] == "#";});
例如,输入
$data = array('#14,000 Paid in Kindle Store (', '', '(');
上面的数组_过滤器给出
array(1) {
[0]=>
string(30) "#14,000 Paid in Kindle Store ("
}
然后,您可以过滤/转换单个值,例如使用数组映射:
array_map(function($e) {return rtrim($e, ' (');}, $data);
这将给您留下:
array(1) {
[0]=>
string(28) "#14,000 Paid in Kindle Store"
}
要仅选择当前选定文本节点的所需子集,请使用:
//li[@id="SalesRank"]/text()[starts-with(., '#')]
(//li[@id="SalesRank"]/text()[starts-with(., '#')])[3]
translate((//li[@id="SalesRank"]/text()[starts-with(., '#')])[3],
'(',
'')
可以使用基于1的索引选择每个单独的此类节点
例如:
//li[@id="SalesRank"]/text()[starts-with(., '#')]
(//li[@id="SalesRank"]/text()[starts-with(., '#')])[3]
translate((//li[@id="SalesRank"]/text()[starts-with(., '#')])[3],
'(',
'')
选择此文本节点:
#20,957 Paid in Kindle Store (
要获取不带尾随”(“
字符的文本,请使用translate()
(或substring()
)函数:
//li[@id="SalesRank"]/text()[starts-with(., '#')]
(//li[@id="SalesRank"]/text()[starts-with(., '#')])[3]
translate((//li[@id="SalesRank"]/text()[starts-with(., '#')])[3],
'(',
'')
评估时产生:
#20,957 Paid in Kindle Store
抱歉弄错了,我打开这个问题有点晚了,在发布这个问题后得到了更新的答案……好吧……我想……我应该使用更新的xpath吗?我不知道,但我和你一样好奇:)