我正在使用以下代码来删除亚马逊的一些数据
$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()
,但我很难实现它。还有,#34;("也需要从字符串中删除
请指导我..我可以修改我的代码吗?
答案 0 :(得分:1)
这似乎是answered pretty thoroughly here。
看起来接受的答案使用:
substring-before(normalize-space(/html/body//ul/li[@id="SalesRank"]/b[1]/following-sibling::text()[1])," ")
还展示了其他一些不错的选择。
答案 1 :(得分:1)
要仅选择当前所选文本节点的所需子集,请使用:
//li[@id="SalesRank"]/text()[starts-with(., '#')]
您可以使用其基于1的索引选择每个此类节点。
例如:
(//li[@id="SalesRank"]/text()[starts-with(., '#')])[3]
选择此文字节点:
#20,957 Paid in Kindle Store (
要获取不带尾随"("
字符的文字,请使用translate()
(或substring()
)功能:
translate((//li[@id="SalesRank"]/text()[starts-with(., '#')])[3],
'(',
'')
评估时产生:
#20,957 Paid in Kindle Store
答案 2 :(得分:0)
您可能只是稍微调整一下xpath查询,但您也可以使用array_filter()来过滤数组。例如:
array_filter($data, function($e) {return $e[0] == "#";});
输入例如
$data = array('#14,000 Paid in Kindle Store (', '', '(');
上面的array_filter给出了
array(1) {
[0]=>
string(30) "#14,000 Paid in Kindle Store ("
}
然后,您可以过滤/转换单个值,例如使用array_map:
array_map(function($e) {return rtrim($e, ' (');}, $data);
会让你:
array(1) {
[0]=>
string(28) "#14,000 Paid in Kindle Store"
}