Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从foreach循环获取所需元素_Php_Regex_Arrays_Xpath - Fatal编程技术网

Php 从foreach循环获取所需元素

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 =>

我使用下面的代码从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 => 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吗?我不知道,但我和你一样好奇:)