我有一个抓取来自第三方源的HTML的PHP应用程序,HTML可能带有一个或多个IMG元素。我想抓住第一个完整的IMG实例,但不知道如何去做。删除HTML块中的第一个IMG元素
任何人都可以把我推向正确的方向吗?
谢谢。
我有一个抓取来自第三方源的HTML的PHP应用程序,HTML可能带有一个或多个IMG元素。我想抓住第一个完整的IMG实例,但不知道如何去做。删除HTML块中的第一个IMG元素
任何人都可以把我推向正确的方向吗?
谢谢。
您可以使用XPath来解析html,并提取您想要的数据。它比字符串位置检查更复杂一些,但是如果您决定需要更具体的内容(例如,第一个img
标记的src
和alt
),它具有更强大的优势。
首先将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
标记执行任何操作,例如提取特定属性,则为您提供更大的灵活性。
jQuery可以为你做这个。
$('img')[0]
如果它是在HTML中您的网页内的小款,然后相应地调整选择。
这对于PHP应用程序来说并不是非常有用。 – jeroen 2014-11-01 00:17:08
如果您认为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" />
更好的方式:写在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>';
}
退房http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php – jeroen 2014-11-01 00:15:09