Прежде всего, вы не должны использовать регулярные выражения для извлечения данных из строки HTML .
Вместо этого вы должны использовать DOM Parser !
Здесь вы можете использовать:
DOMDocument::loadHTML
для загрузки строки HTML
- в конечном итоге, используя оператор
@
, чтобы заставить замолчать предупреждения, поскольку ваш HTML-код не совсем корректен.
-
DOMXPath
класс для выполнения запросов XPath к документу
- Методы DOM для работы с результатами запроса
Например, вы можете загрузить документ и создать экземпляр DOMXpath
class следующим образом:
$html = <<<HTML
....
....
HTML;
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
И затем используйте XPath, чтобы найти элементы, которые вы ищете.
Например, в первом случае вы можете использовать что-то вроде этого, чтобы найти все теги <a>
, которые являются потомками тегов <h2>
:
// <h2><a ....>_____</a></h2>
$tags = $xpath->query('//h2/a');
foreach ($tags as $tag) {
var_dump($tag->nodeValue);
}
echo '<hr />';
Затем для второго и третьего случая вы ищете теги <a>
, которые являются потомками тегов <cite>
- и когда вы их нашли, вы хотите проверить, имеют ли они атрибут href
или нет:
// <cite><a href="_____" .... >...</a></cite>
// <cite><a .... >________</a></cite>
$tags = $xpath->query('//cite/a');
foreach ($tags as $tag) {
if ($tag->hasAttribute('href')) {
var_dump($tag->getAttribute('href'));
} else {
var_dump($tag->nodeValue);
}
}
echo '<hr />';
И, наконец, для последнего, вы просто хотите <span>
теги:
// <span>_________</span>
$tags = $xpath->query('//span');
foreach ($tags as $tag) {
var_dump($tag->nodeValue);
}
Не так сложно - и намного легче читать эти регулярные выражения, не так ли? ; -)