2013-11-10 1 views
0

Я пытаюсь разобрать информацию между тегами HTML. Используя регулярное выражение, как я могу избежать значения названия, поскольку они разные, и анализировать информацию только в тегах?анализируя информацию в тегах HTML, избегая значения заголовка

HTML код:

<p class=period> 
<abbr class=dtstart title=2010>2010</abbr> 
<abbr class=dtend title=2012>2012</abbr> 
</p> 

из положить должно быть что-то вроде: 2010, 2012

Я использую этот метод и его работает отлично, если заголовок = 2010:

$experience .= "<c:start_date>". trim($this->parse_text($tmp3[$i], "<abbr class=\"dtstart\" title=\"2010\">", "</abbr>"))."</c:start_date>\r\n"; 

Я пробовал: title=\"(.*)\" но его не работает! любое предложение, на котором я должен использовать регулярное выражение?

Большое спасибо

+0

Как 'parse_text)' определена (? – ComFreek

+0

регулярное выражение название = (\ d +) – Nirock

+0

функция parse_text: 'Функция parse_text ($ ул, $ старт, $ конец) { , если (пусто ($ ул)) { возврата; } $ pos_start = strpos ($ str, $ start); $ pos_end = strpos ($ str, $ end, ($ pos_start + strlen ($ start))); if (($ pos_start! == false) && ($ pos_end! == false)) { $ pos1 = $ pos_start + strlen ($ start); $ pos2 = $ pos_end - $ pos1; return substr ($ str, $ pos1, $ pos2); } возвращение; } ' – Lara

ответ

0

Регулярные выражения не были разработаны для разбора HTML. Вы лучше с помощью DOM/XPath:

$html = <<<HTML 
<p class=period> 
<abbr class=dtstart title=2010>2010</abbr> 
<abbr class=dtend title=2012>2012</abbr> 
</p> 
HTML; 
$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
$dtstart = $xpath->query("//abbr[contains(@class, 'dtstart')]")->item(0)->nodeValue; 
$dtend = $xpath->query("//abbr[contains(@class, 'dtend')]")->item(0)->nodeValue; 

Чтобы извлечь как dtstart и dtend в одном массиве ...

$dates = $xpath->query("//abbr[contains(@class, 'dtstart') or contains(@class, 'dtend')]"); 
list($dtstart, $dtend) = array_map(function ($node) { 
    return $node->nodeValue; 
}, iterator_to_array($dates));