【问题标题】:HTML Regex to Extract Data用于提取数据的 HTML 正则表达式
【发布时间】:2015-08-04 03:33:49
【问题描述】:

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

谢谢!

【问题讨论】:

标签: php regex


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

我强烈建议为此使用 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);

【讨论】:

  • 这和宣传的一样。其他人不会抓住重复的群体。谢谢!
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 2010-09-26
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多