如何在以下介绍空白?

时间:2012-12-31 12:35:35

标签: php

下面的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;

4 个答案:

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

要解决这个问题,我们应该做两件事:

  1. 选择相应节点中的<li>个节点。将XPath更改为//ul[@class="dpItemFeaturesList"]/li
  2. foreach循环中将2个不可分隔空格&nbsp;&nbsp;(因为这是HTML)连接到$desc变量。
  3. 此处$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 .= "&nbsp;&nbsp;";
                    }
                    $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

See the demo