HTML正则表达式提取数据

时间:2013-09-24 00:38:31

标签: php regex

我对正则表达式大师有一个简单的问题。是的...我在发布之前尝试了几种不同的正则表达式。原谅我的正则表达无知。这是针对PHP的。

我有以下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);

谢谢!

3 个答案:

答案 0 :(得分:2)

正则表达式很棒。但是,有些东西最好用解析器解决。标记就是这样一个例子。

我没有使用正则表达式,而是使用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
}

答案 1 :(得分:0)

根据您提供的确切输入,这将执行您想要的操作。如果您需要更通用的东西,请告诉我。

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

点击此处观看直播演示http://www.phpliveregex.com/p/1i3

答案 2 :(得分: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);
相关问题