2013-09-24 4 views
0

У меня есть простой вопрос для гуру-регекса. И да ... Я попробовал несколько различных вариантов регулярного выражения, прежде чем публиковать здесь. Простите мое незнакомое регулярное выражение. Это нацелено на PHP.HTML-выражение для извлечения данных

У меня есть следующий HTML:

<div> 
    <h4> 
     <a href="somelink.html">some text blah</a> 
    </h4> 
    I need this text<br />I need this text too.<br /> 
</div> 
<div> 
    <h4> 
     <a href="somelink.html">some text blah</a> 
    </h4> 
    I need this text<br />I need this text too.<br /> 
</div> 
<div> 
    <h4> 
     <a href="somelink.html">some text blah</a> 
    </h4> 
    I need this text<br />I need this text too.<br /> 
</div> 

То, что я пытался, что, казалось, скорее всего, работать:

preg_match_all('/<div><h4><a href=".*">.*<\/a><\/h4>(.*)<br \/>(.*)<br \/>/', $haystack, $result); 

выше возвращает ничего.

Итак, я попробовал это, и я получил первую группу, чтобы соответствовать, но я не смог получить вторую.

preg_match_all('/<div><h4><a href=".*">.*<\/a><\/h4>(.*)<br \/>/', $haystack, $result); 

Спасибо!

+5

* Используйте HTML-парсер * – Ryan

+1

возможно дубликат [спичечных RegEx открытых тегов, кроме XHTML автономных тегов] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-self-contains-tags) – Dai

+1

'. *' не будет соответствовать новым строкам без [модификатора '/ s'] (http://us2.php.net/manual/en/reference.pcre.pattern.modifiers .php). – user113215

ответ

0

Я настоятельно рекомендую использовать DOM и XPath для этого.

$doc = new DOMDocument; 
@$doc->loadHTML($html); 

$xp = new DOMXPath($doc); 

foreach($xp->query('//div/text()') as $n) { 
    list($before, $after) = explode('<br />', trim($n->wholeText)); 
    echo $before . "\n" . $after; 
} 

Но если вы все еще решите использовать маршрут регулярного выражения, это будет работать на вас.

preg_match_all('#</h4>\s*([^<]+)<br />([^<]+)#', $str, $matches); 
+0

Это работало как рекламируемое. Другие не собирались повторять группы. Благодаря! – a432511

2

Regex is great. Но некоторые вещи лучше всего решать с помощью парсера. Одним из таких примеров является разметка.

Вместо того, чтобы использовать регулярное выражение, я бы использовать HTML-анализатор, как http://simplehtmldom.sourceforge.net/

Однако, если вы настаиваете на использовании регулярных выражений для этого конкретного случая, вы можете использовать этот шаблон:

if (preg_match('%</h4>(\\r?\\n)\\s+(.*?)(<br />)(.*?)(<br />)%', $subject, $regs)) { 
    $first_text_string = $regs[2]; 
    $second_text_string = $regs[4]; 
} else { 
    //pattern not found 
} 
+0

Сравнительный список альтернатив 'simplehtmldom' (который может быть довольно медленным и громоздким) [можно найти здесь] (http://stackoverflow.com/a/3577662/358679) – Wrikken

+0

FYI, я также рекомендую RegexBuddy, поскольку я Ранее упоминалось в этом сообщении: http://stackoverflow.com/a/18132398/278976 – Homer6

+0

Кроме того, возможно, вы захотите попробовать этот параметр: http://stackoverflow.com/a/1732454/278976 – Homer6

0

Это будет делать то, что вы хотите, учитывая точный ввод, который вы предоставили. Если вам нужно что-то более общее, пожалуйста, дайте мне знать.

(.*)<br\s*\/>(.*)<br\s*\/> 

Смотрите здесь для живой демонстрации http://www.phpliveregex.com/p/1i3

Смежные вопросы