Как в PHP извлечь содержимое тега, используя регулярные выражения?

Столкнулся со следующей проблемой: занимаясь парсингом сайта (HTML DOM Parser) оказался в неприятной ситуации с извлечением информации из тега.
Имеется массив $el, содержащий следующие строки:
<a href="test">TEST1</a>
<span id="info">INFO</span>
<a href="test2">TEST2</a>

Мне следует просто вывести содержимое тегов. Сделал следующим образом:
$txt = $el->innertext;
preg_match ( '/<a[^>]+?[^>]+>(.*?)<\/a>/i' , $txt , $matches); 
$info['TEST1:'] = str_replace("TEST1:","",$matches[1]);
preg_match ( '/<a[^>]+?[^>]+>(.*?)<\/a>/i', $txt , $matches); // не знаю как вывести содержимое второго тега <a></a>
$info['TEST2:'] = str_replace("TEST2:","",$matches[1]);
preg_match ( '/<span[^>]+?[^>]+>(.*?)<\/span>/i' , $txt , $matches);
$info['INFO:'] = str_replace("INFO:","",$matches[1]);

Вынести TEST1 и INFO удалось, а TEST2, к сожалению, нет. Как это можно сделать (вынести содержимое второго тега <a></a>?

Так же есть массив, который содержит:
<span class="date">01 декабря 2013 — 02:20</span> // например


Как вынести отдельно дату (до тире), и время (после), используя регулярные выражения?
  • Вопрос задан
  • 20722 просмотра
Решения вопроса 2
egor_nullptr
@egor_nullptr
$doc = new DomDocument('1.0', 'utf-8');
$doc->loadXML('<body>'.$txt.'</body>');
$xp = new DomXPath($doc);

foreach ($xp->query('//a') as $anode) {
    echo $anode->nodeValue;
};

foreach ($xp->query('//span[@class="date"]') as $date_node) {
    list($date, $time) = explode(' - ', $date_node->nodeValue);
};
Ответ написан
Комментировать
Если у вас есть проблема, и вы собираетесь решать ее с использованием регулярных выражений, то у вас есть две проблемы.
Боян, но всегда в тему.
preg_match_all ( '/<a[^>]+?[^>]+>(.*?)<\/a>/i' , $txt , $matches); 
$info['TEST1:'] = str_replace("TEST1:","",$matches[1][0]);
$info['TEST2:'] = str_replace("TEST2:","",$matches[1][1]);
preg_match ( '/<span[^>]+?[^>]+>(.*?)<\/span>/i' , $txt , $matches);
$info['INFO:'] = str_replace("INFO:","",$matches[1]);
print_r($info);

Для разбиения даты все же используйте explode(). Не надо пихать регэкспы везде и всюду.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ScorpLeX
@ScorpLeX
Ответ написан
Комментировать
demimurych
@demimurych
Почему бы не использовать уже готовые решения?
например simplehtmldom.sourceforge.net/ позволяет получать все что нужно jquery like запросами
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы