Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 提取数据的HTML正则表达式_Php_Regex - Fatal编程技术网

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 />

我有一个简单的问题要问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('/.*(.*)(.*),$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,正如我之前在这篇文章中提到的:这就像广告宣传的那样有效。其他人不会看到重复的群组。谢谢!