Вы можете использовать XPath для синтаксического анализа html и извлечения нужных данных таким образом. Это немного сложнее, чем проверка позиции строки, но имеет то преимущество, что он немного более надежен, если вы решите, что вам нужно что-то более конкретное (например, src
и alt
первого тега img
).
Сначала вы загружаете строку 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]
. Примечание. Это не то же самое, что //img[1]
, хотя часто может давать аналогичные результаты. здесь есть хорошее объяснение разницы между ними.
$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;
}
```
Так что в целом это немного более сложный подход, чем выполнение strpos
или регулярного выражения в html, но он должен предоставить вам большую гибкость, если вы решите сделать что-либо с тегом img
, например, вытащить определенный атрибут.
person
ConroyP
schedule
01.11.2014