регулярное выражение tog et значения атрибутов тега html - PullRequest
0 голосов
/ 27 марта 2010
<li class="zk_list_c2 f_l"><a title="abc" target="_blank" href="link">
                                        abc
                                    </a>&nbsp;</li>

Как мне извлечь ABC и ссылку?

$pattern="/<li class=\"zk_list_c2 f_l\"><a title=\"(.*)\" target=\"_blank\" href=\"(.*)\">\s*(.*)\s*<\/a>&nbsp;<\/li>/m";
preg_match_all($pattern, $content, $matches);

тот, который у меня сейчас есть, не работает

1 Ответ

9 голосов
/ 27 марта 2010

Учитывая, что вы пытаетесь извлечь некоторые данные из строки 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>&nbsp;</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, это просто вопрос:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...