0

我对正则表达式大师有一个简单的问题。是的......我在此处发布之前确实尝试了正则表达式的几种不同变体。原谅我对正则表达式的无知。这是针对 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);

谢谢!

4

3 回答 3

2

Regex is great. But, some things are best tackled with a parser. Markup is one such example.

Instead of using regex, I'd use an HTML parser, like http://simplehtmldom.sourceforge.net/

However, if you insist on using regex for this specific case, you can use this pattern:

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
}
于 2013-09-24T00:45:47.540 回答
0

给定您提供的确切输入,这将满足您的需求。如果您需要更通用的东西,请告诉我。

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

在这里查看现场演示http://www.phpliveregex.com/p/1i3

于 2013-09-24T01:00:10.637 回答
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);
于 2013-09-24T02:13:35.640 回答