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