从foreach循环中获取所需元素

时间:2012-02-14 16:01:56

标签: php regex arrays xpath

我正在使用以下代码来删除亚马逊的一些数据

$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;("也需要从字符串中删除

请指导我..我可以修改我的代码吗?

3 个答案:

答案 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"
}