0

下面的 PHP 代码片段创建得$desc很好,但我喜欢它在每个找到的内容之间引入两 (2) 个空格,dpItemFeatureList因为它经历了它的迭代。

我似乎无法确切地获得什么或在哪里添加一个片段来做到这一点?

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

4 回答 4

0

由于您将所有内容都附加到 desc,请尝试类似

$desc .= $tot->nodeValue;
$desc .= "<br />"
于 2012-12-31T12:39:53.650 回答
0

试试看:

$desc .= $tot->nodeValue.'  ';

trim($desc)在循环之后避免最后有两个空格。

或者,或者创建一个数组:

$desc = array();
//....
$desc[] = $tot->nodeValue;

并返回implode(' ', $desc)

于 2012-12-31T12:40:39.040 回答
0

查看您在此处共享的代码,然后查看您正在处理的数据(我在此处粘贴的示例),您实际上想要在节点的<li>子元素中收集文本。<ul class="dpItemFeaturesList">

在您的原始代码片段中,您的 XPath 如下所示:

'//ul[@class="dpItemFeaturesList"]'

这只会选择<ul>元素而不是子元素。因此,当您尝试执行 a$tot->nodeValue时,它将连接所有子节点中的所有文本而没有空格(啊哈,您首先需要空格的真正原因)。

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

  1. 选择<li>适当节点内的节点。将 XPath 更改为//ul[@class="dpItemFeaturesList"]/li.
  2. foreach循环中,将 2 个不可破坏的空格&nbsp;&nbsp;(因为这是 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 .= "&nbsp;&nbsp;";
                }
                $desc .= $tot->nodeValue;
            }
        }
    }
    return $desc;
}

我们进行检查,$c > 0以便您不会在循环中的最后一个节点之后获得额外的空格。

PS:与您的原始问题无关。您共享链接的代码$timestamp$date = date("format", $timestamp);on中有一个未定义的变量line 116

于 2012-12-31T12:41:36.740 回答
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;
        }

这是有效的,因为除了零之外的每个整数都true在 PHP 中。

请参阅演示

于 2012-12-31T12:42:35.567 回答