下面的PHP代码片段创建了$desc
,但是我喜欢在它经历迭代时找到的每个dpItemFeatureList
之间引入两(2)个空格。
我似乎无法确切地知道在哪里或哪里添加一个片段来执行此操作?
function get_description($asin){
$url = 'http://www.amazon.com/gp/aw/d/' . $asin . '?d=f&pd=1';
$data = request_data($url);
$desc = '';
if ($data) {
$dom = new DOMDocument();
@$dom->loadHTML($data);
$xpath = new DOMXPath($dom);
if (preg_match('#dpItemFeaturesList#',$data)){
$k = $xpath->query('//ul[@class="dpItemFeaturesList"]');
foreach ($k as $c => $tot) {
$desc .= $tot->nodeValue;
}
}
}
return $desc;
答案 0 :(得分:0)
由于您要将所有内容附加到desc,请尝试类似
的内容$desc .= $tot->nodeValue;
$desc .= "<br />"
答案 1 :(得分:0)
试试:
$desc .= $tot->nodeValue.' ';
循环后和trim($desc)
以避免在结尾处有两个空格。
或者,创建一个数组:
$desc = array();
//....
$desc[] = $tot->nodeValue;
并返回implode(' ', $desc)
答案 2 :(得分:0)
查看您共享的代码here,然后查看您正在处理的数据(我已粘贴的样本here),您实际上想要收集的内容是<li>
节点的<ul class="dpItemFeaturesList">
子元素。
在原始代码段中,您的XPath如下:
'//ul[@class="dpItemFeaturesList"]'
这只会选择<ul>
元素而不子元素。因此,当您尝试执行$tot->nodeValue
时,它将连接所有子节点中没有空格的所有文本(啊哈,这是您首先想要空格的真正原因)。< / p>
要解决这个问题,我们应该做两件事:
<li>
个节点。将XPath更改为//ul[@class="dpItemFeaturesList"]/li
。foreach
循环中将2个不可分隔空格
(因为这是HTML)连接到$desc
变量。此处$c
是数组索引。
function get_description($asin){
$url = 'http://www.amazon.com/gp/aw/d/' . $asin . '?d=f&pd=1';
$data = request_data($url);
$desc = '';
if ($data) {
$dom = new DOMDocument();
@$dom->loadHTML($data);
$xpath = new DOMXPath($dom);
if (preg_match('#dpItemFeaturesList#',$data)){
$k = $xpath->query('//ul[@class="dpItemFeaturesList"]/li');
foreach ($k as $c => $tot) {
if ($c > 0) {
$desc .= " ";
}
$desc .= $tot->nodeValue;
}
}
}
return $desc;
}
我们检查$c > 0
,以便在循环中的最后一个节点之后不获取额外的空格。
P.S。:与您原来的问题无关。您共享链接的代码在$timestamp
上的$date = date("format", $timestamp);
中有一个未定义的变量line 116
。
答案 3 :(得分:0)
如果你需要在每个迭代之间添加,但第一个:
$k = $xpath->query('//ul[@class="dpItemFeaturesList"]');
foreach ($k as $c => $tot) {
$c && $desc .= ' '; # all but first
$desc .= $tot->nodeValue;
}
这是一个表达式,可以为您节省if
,但它的工作方式类似。也许有点味道如此肯定,if
也可以这样做:
$k = $xpath->query('//ul[@class="dpItemFeaturesList"]');
foreach ($k as $c => $tot) {
if($c) $desc .= ' '; # all but first
$desc .= $tot->nodeValue;
}
这是有效的,因为PHP中的每个整数都是true
。