Учитывая, что вы пытаетесь извлечь некоторые данные из строки HTML, регулярные выражения, как правило, не являются подходящим / лучшим инструментом для работы.
Вместо этого, почему бы не использовать DOM-парсер , такой как DOMDocument
класс , предоставляемый с PHP, и его DOMDocument::loadHTML
метод?
Затем вы можете перемещаться по документу HTML с помощью методов DOM - что гораздо проще, чем с помощью регулярных выражений, особенно если учесть, что HTML не совсем обычный .
Вот, например, вы можете использовать что-то вроде этого:
$html = <<<HTML
<li class="zk_list_c2 f_l"><a title="abc" target="_blank" href="link">
abc
</a> </li>
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
$as = $dom->getElementsByTagName('a');
foreach ($as as $a) {
var_dump($a->getAttribute('href'));
var_dump(trim($a->nodeValue));
}
И вы получите следующий вывод:
string(4) "link"
string(3) "abc"
Я бы сказал, что код не совсем сложный, но, в нескольких словах, вот что он делает:
Просто примечание: вы можете проверить, существует ли атрибут href
с DOMElement::hasAttribute
, прежде чем пытаться использовать его значение ...
РЕДАКТИРОВАТЬ после комментариев: вот краткий пример использования DOMXpath для перехода по ссылкам; Я предполагаю, что вы хотите ссылку, которая находится внутри тега <li>
с class="zk_list_c2 f_l"
:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$as = $xpath->query('//li[@class="zk_list_c2 f_l"]/a');
foreach ($as as $a) {
var_dump($a->getAttribute('href'));
var_dump(trim($a->nodeValue));
}
И снова вы получите:
string(4) "link"
string(3) "abc"
Как вы можете видеть, единственное, что меняется, это то, как вы используете, чтобы добраться до нужного тега <a>
: вместо DOMDocument::getElementsByTagName
, это просто вопрос: