【问题标题】:Parse img and html codes with dom (php)使用 dom (php) 解析 img 和 html 代码
【发布时间】:2019-12-28 11:55:14
【问题描述】:

我有一个解析 img 和 texts 的代码。运行 php 文件中的代码。它只是显示 img src、abc、img src、dfe。而且我的代码不规则。 img 标签可能带有链接。

我想解析 img 和下一个 html。像这样:

Array
(
    [0] => Array
        (
            [src] => http://www.whatever.com
            [text] =>  abc
    <br>
    <h3>title</h3>
    <div class="content">content <a href="link">my link</a></div>
        )

    [1] => Array
        (
            [src] => http://goingnowhere.com
            [text] =>  def
    <br>
    <h3>title 2</h3>
    <div class="content">content <a href="link">my link</a>

    bla bla bla

    </div>
        )

)

我该怎么做?我当前的代码:

<?php $sample_html = '
<img src="http://www.whatever.com" alt="" />
abc
<br>
<h3>title</h3>
<div class="content">content <a href="link">my link</a></div>
<img src="http://goingnowhere.com" alt="">
def
<br>
<h3>title 2</h3>
<div class="content">content <a href="link">my link</a>

bla bla bla

</div>
';

$dom = new DOMDocument();
$dom->loadHTML($sample_html);

$data = array();
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
$data[] = array(
'src' => $image->getAttribute('src'),
'text' => trim($image->nextSibling->textContent),
);
}

echo '<pre>';
print_r($data); ?>

【问题讨论】:

  • trim($image-&gt;nextSibling-&gt;textContent) 只会在下一个项目中给出文本,看起来你想要所有的 HTML 直到下一个 &lt;img&gt; 标记 - 关于何时停止提取 HTML 是否有任何限制在&lt;img&gt; 标签之后?
  • 我需要img标签、abc等html内容。数据中的 img 和 html。我的 html 代码不规则。我只需要解析 img 和 html。提前致谢。

标签: php html parsing dom


【解决方案1】:

使用 xpath 遍历所有节点并使用两个 img 标签检索数据。

<?php $sample_html = '
<img src="http://www.whatever.com" alt="" />
abc
<br>
<h3>title</h3>
<div class="content">content <a href="link">my link</a></div>
<img src="http://goingnowhere.com" alt="">
def
<br>
<h3>title 2</h3>
<div class="content">content <a href="link">my link</a>

bla bla bla

</div>
';

$dom = new DOMDocument();
@$dom->loadHtml($sample_html);

$xpath = new DOMXPath($dom);

$snippet = '';
$arr = array();
$count = $xpath->query('//img')->length;
//loop through all img tags
for($i=0;$i<$count;$i++){

    $node = $xpath->query('//img')->item($i);
    $img_src = $node->getAttribute('src');//first image src

    while ($node = $node->nextSibling) {

      if (get_class($node) != 'DOMElement') {
        continue;
      }

      if ($node->tagName  == 'img') {
        $snippet .= $dom->saveXML($node);
        $arr[] = array(
            'src'=>$img_src,
            'content'=>$snippet
        );
        $img_src = $node->getAttribute('src');//last img src
        $snippet = '';
        break;
      }
      $snippet .= $dom->saveXML($node);

    }
}
//fill last img data
$arr[] = array('src'=>$img_src,'content'=>$snippet);

【讨论】:

  • 如何将 img 和 htmls 附加到数据中并分别使用它们? (就像我的代码一样)[0]=>(["img"]=>",["html"]=>"html 代码")
  • 它有所帮助,但没有回显“abc”和“def”。 :) 我也需要文字。可以再试一次吗?
  • 然后评论if (get_class($node) != 'DOMElement') 这个条件,它会忽略非dom元素
  • 我删除了那 3 行,我得到了这个错误:“注意:未定义的属性:第 36 行中的 DOMText::$tagName。”你能再看看并更改代码吗?谢谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2019-12-24
  • 2013-02-15
  • 2014-05-28
相关资源
最近更新 更多