Php 去掉HTML块中的第一个IMG元素

Php 去掉HTML块中的第一个IMG元素,php,html,Php,Html,我有一个PHP应用程序,可以从第三方来源获取HTML,HTML可能包含一个或多个IMG元素。我想抓住第一个完整的IMG实例,但不知道如何去做 有人能把我推向正确的方向吗 谢谢。jQuery可以帮你做这件事 $('img')[0] 如果它位于页面中HTML的较小部分,则相应地调整选择器。如果您假定HTML是有效的HTML,则下面的示例将起作用,但我们不能假定!如果您100%确定它是一个有效的HTML,那么继续使用它,如果不是,我建议您使用更好的方式,如下所示 $html = '<br /&g

我有一个PHP应用程序,可以从第三方来源获取HTML,HTML可能包含一个或多个IMG元素。我想抓住第一个完整的IMG实例,但不知道如何去做

有人能把我推向正确的方向吗


谢谢。

jQuery可以帮你做这件事

$('img')[0]


如果它位于页面中HTML的较小部分,则相应地调整选择器。

如果您假定HTML是有效的HTML,则下面的示例将起作用,但我们不能假定!如果您100%确定它是一个有效的HTML,那么继续使用它,如果不是,我建议您使用更好的方式,如下所示

$html = '<br />First<img src="path/abc.jpg" />Next<img src="path/cde.jpg" />';

$start = stripos($html, '<img');
$extracted = substr($html, $start);
$end = stripos($extracted, '>');

echo substr($html, $start, $end+1);
  • 用PHP5+编写的HTMLDOM解析器可以让您以非常简单的方式操作HTML 简单的方法
  • 需要PHP5+
  • 支持无效的HTML
  • 使用选择器在HTML页面上查找标记,就像jQuery一样
  • 在一行中从HTML中提取内容

    • 您可以使用XPath解析html,并以这种方式提取所需的数据。它比字符串位置检查要复杂一点,但如果您决定需要更具体的内容(
      src
      alt
      ,例如,first
      img
      标记),它的优点是更加健壮

      首先将html字符串加载到DOMDocument中,然后将其加载到XPath中

      // Create DOM from URL or file
      $html = file_get_html('http://www.google.com/');
      
      // Find all images 
      foreach($html->find('img') as $element) {
             echo $element->src . '<br>';
      }
      
      我们需要页面上出现的第一个
      img
      ,因此使用选择器
      /genderant::img[1]
      。注意,这与
      //img[1]
      不同,尽管这通常会给出类似的结果。这两者之间的区别有很好的解释

      // Load html in to DOMDocument, set up XPath
      $doc = new DOMDocument();
      $doc->loadHTML($html);
      $xpath = new DOMXPath($doc);
      
      使用XPath的一个缺点是,说“将与
      img
      标记匹配的完整字符串返回给我”并不容易,因此我们可以组合一个简单的函数,该函数将迭代匹配节点的属性并重新构建
      img
      标记

      $matches = $xpath->evaluate("/descendant::img[1]");
      
      $tag=“”
      “这里有一些文字”;
      //将html加载到DOMDocument,设置XPath
      $doc=新的DOMDocument();
      $doc->loadHTML($html);
      $xpath=新的DOMXPath($doc);
      //获取文档中的第一个img
      //注意:与“//img[1]”不同-参见https://stackoverflow.com/a/453902/2287
      $matches=$xpath->evaluate(“/genderant::img[1]”);
      foreach($matches作为$match进行匹配){
      echo buildImgTag($match);
      }
      /**
      *建立一个img标签,给出它的匹配节点
      *
      *@param domeElement$node Img node
      *
      *@return-img标签
      */
      函数buildImgTag($node){
      $tag=“”;
      返回$tag;
      }
      
      ```


      因此,总体而言,这是一种比在html上执行
      strpos
      或regex稍微复杂一些的方法,但如果您决定使用
      img
      标记执行任何操作,例如拉出特定属性,则应能为您提供更大的灵活性。

      请查看这对PHP应用程序不是很有用的。
      $tag = "<img ";
      foreach ($node->attributes as $attr) {
          $vals[] = $attr->name . '="' . $attr->value . '"';
      }
      $tag .= implode(" ", $vals) . " />";
      
      <?php
      // Example html
      $html = '<html><body>'
          . ' <img src="/images/my-image.png" alt="My image" width="100" height="100" />'
          . 'Some text here <img src="do-not-want-second.jpg" alt="No thanks" />';
      
      // Load html in to DOMDocument, set up XPath
      $doc = new DOMDocument();
      $doc->loadHTML($html);
      $xpath = new DOMXPath($doc);
      
      // Get the first img in the doc
      // N.B. Not the same as "//img[1]" - see https://stackoverflow.com/a/453902/2287
      $matches = $xpath->evaluate("/descendant::img[1]");
      foreach ($matches as $match) {
          echo buildImgTag($match);
      }
      
      /**
       * Build an img tag given it's matched node
       *
       * @param DOMElement $node Img node
       *
       * @return Rebuilt img tag
       */
      function buildImgTag($node) {
          $tag = "<img ";
          $vals = array();
          foreach ($node->attributes as $attr) {
              $vals[] = $attr->name . '="' . $attr->value . '"';
          }
          $tag .= implode(" ", $vals) . " />";
      
          return $tag;
      }