2014-11-01 28 views
-1

我有一个抓取来自第三方源的HTML的PHP​​应用程序,HTML可能带有一个或多个IMG元素。我想抓住第一个完整的IMG实例,但不知道如何去做。删除HTML块中的第一个IMG元素

任何人都可以把我推向正确的方向吗?

谢谢。

+0

退房http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php – jeroen 2014-11-01 00:15:09

回答

1

您可以使用XPath来解析html,并提取您想要的数据。它比字符串位置检查更复杂一些,但是如果您决定需要更具体的内容(例如,第一个img标记的srcalt),它具有更强大的优势。

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

// Load html in to DOMDocument, set up XPath 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 

我们希望的是,页面上出现的第一个img,所以使用选择/descendant::img[1]。 N.B,这与//img[1]不一样,虽然这可能经常给出类似的结果。关于两者的区别有一个很好的解释here

$matches = $xpath->evaluate("/descendant::img[1]"); 

使用XPath的一个缺点是,它不会很容易地说:“给我回已经为img标签相匹配的满弦”,所以我们可以把一个简单的函数,将遍历匹配的节点的属性并重新构建一个img标记。

$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; 
} 

```

所以,总体来说这是一个稍微复杂一点的办法不是做的HTML一个strpos或正则表达式,但应该如果您决定对img标记执行任何操作,例如提取特定属性,则为您提供更大的灵活性。

-3

jQuery可以为你做这个。

$('img')[0]

如果它是在HTML中您的网页内的小款,然后相应地调整选择。

+0

这对于PHP应用程序来说并不是非常有用。 – jeroen 2014-11-01 00:17:08

0

如果您认为HTML是一个有效的HTML,则以下示例可行,但我们不能假设!如果你100%确定它是一个有效的HTML,那么继续使用它,如果不是,我会建议你使用BETTERWAY,如下所示。

$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); 

此代码会给你:<img src="path/abc.jpg" />

  1. 查找<img从第一次出现点开始不区分大小写的功能 stripos
  2. 印章实际数据中第一次出现。
  3. 找到>不区分大小写的功能 stripos
  4. 提取物中首次出现什么用 substr起点和终点之间下降英寸

更好的方式:写在PHP5 +

PHP Simple HTML DOM Parser Manual

// 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>'; 
} 
  • 一个HTML DOM解析器让你在一个非常 简单的方法操作HTML!
  • 需要PHP 5+。
  • 支持无效的HTML。
  • 像jQuery一样用选择器在HTML页面上查找标签。
  • 从一行中提取HTML中的内容。
相关问题