Php 提取数据的HTML正则表达式
我有一个简单的问题要问regex大师。是的。。。在这里发布之前,我尝试了几种不同的正则表达式。请原谅我对正则表达式的无知。这是针对PHP的 我有以下HTML:Php 提取数据的HTML正则表达式,php,regex,Php,Regex,我有一个简单的问题要问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>
<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('/.*(.*)
(.*)
,$haystack,$result);
以上结果不返回任何内容
然后我尝试了这个,我得到了第一组比赛,但我没有得到第二组
preg_match_all('/<div><h4><a href=".*">.*<\/a><\/h4>(.*)<br \/>/', $haystack, $result);
preg_match_all('/.*(.*)
/',$haystack,$result);
谢谢大家! 正则表达式很棒。但是,有些事情最好用解析器来解决。标记就是这样一个例子 我不使用正则表达式,而是使用HTML解析器,如 但是,如果您坚持在这种特定情况下使用正则表达式,则可以使用以下模式:
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
}
if(预匹配('%(\\r?\\n)\\s+(.*)(
)(.*)(.*)(
)%,$subject,$regs)){
$first_text_string=$regs[2];
$second_text_string=$regs[4];
}否则{
//找不到模式
}
根据您提供的准确输入,这将实现您想要的功能。如果你需要更普通的东西,请告诉我
(.*)<br\s*\/>(.*)<br\s*\/>
(.*)(.*)
请看这里的实时演示我强烈建议使用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;
}
$doc=新文档;
@$doc->loadHTML($html);
$xp=新的DOMXPath($doc);
foreach($xp->query('//div/text()')作为$n){
列表($before,$after)=分解('
',修剪($n->wholeText));
回音$before.\n.$after;
}
但是,如果您仍然决定使用正则表达式,这将对您有效
preg_match_all('#</h4>\s*([^<]+)<br />([^<]+)#', $str, $matches);
preg\u match\u all(“#\s*”(*
的可能重复项没有匹配换行符。DOMXPath
,//div/text()[previous sibling::h4]
添加了多个重复行。simplehtmldom
的替代项的比较列表(可能非常缓慢且繁琐)仅供参考,我也推荐RegexBuddy,正如我之前在这篇文章中提到的:这就像广告宣传的那样有效。其他人不会看到重复的群组。谢谢!