【问题标题】:regex php: find everything in div正则表达式 php:在 div 中查找所有内容
【发布时间】:2010-11-24 00:53:26
【问题描述】:

我正在尝试使用正则表达式在 div 中查找所有内容。我知道可能有更聪明的方法可以做到这一点 - 但我选择了正则表达式。

所以目前我的正则表达式模式如下所示:

$gallery_pattern = '/<div class="gallery">([\s\S]*)<\/div>/';  

它确实起到了作用 - 有点。

问题是如果我有两个 div 一个接一个 - 像这样。

<div class="gallery">text to extract here</div>
<div class="gallery">text to extract from here as well</div>

我想从两个 div 中提取信息,但我的问题是,在测试时,我没有得到中间的文本,而是:

"text to extract here </div>  
<div class="gallery">text to extract from here as well"

总结一下。它跳过了 div 的第一端。并继续下一个。 div 内的文本可以包含&lt;/ 和换行符。让你知道!

有人对这个问题有简单的解决方案吗?我仍然是一个正则表达式新手。

【问题讨论】:

  • 几周前我一直在和我的朋友讨论同样的问题。问题是当你有像“”这样的标签时,很难让表达式在第一个

标签: php regex html extract


【解决方案1】:

当有一个方便的 DOM 库时,你不应该使用正则表达式来解析 HTML:

$str = '
<div class="gallery">text to extract here</div>
<div class="gallery">text to extract from here as well</div>
';

$doc = new DOMDocument();
$doc->loadHTML($str);
$divs = $doc->getElementsByTagName('div');

if ( count($divs ) ) {
    foreach ( $divs as $div ) {
    echo $div->nodeValue . '<br>';
    }
}

【讨论】:

  • +1 用于显示正确的方法,即使它不使用正则表达式。
  • 是的。感谢您显示此选项 - 尽管我想使用正则表达式解决此问题。我可能会稍微看看这个,因为我怀疑这是要走的路。但是,我不接受帕斯卡·马丁斯解决方案!
【解决方案2】:

这样的事情怎么样:

$str = <<<HTML
<div class="gallery">text to extract here</div>
<div class="gallery">text to extract from here as well</div>
HTML;

$matches = array();
preg_match_all('#<div[^>]*>(.*?)</div>#s', $str, $matches);

var_dump($matches[1]);

注意“?”在正则表达式中,所以它“不贪婪”。

这会得到你:

array
  0 => string 'text to extract here' (length=20)
  1 => string 'text to extract from here as well' (length=33)

这应该可以正常工作...如果您没有重叠的 div ;如果你这样做......嗯......实际上:你真的确定要使用理性表达式来解析 HTML,这本身就不是那么理性吗?

【讨论】:

  • @downvoter :当你投反对票时,请你解释一下答案有什么问题吗?这对每个人都有好处:回答(我)的人,所以他不会再犯同样的错误;人们阅读答案,所以他们知道其中有问题,以及什么......(如果是因为我使用了正则表达式:好吧,OP说他知道有更好的方法,但他说他想要一个正则表达式...... .)
  • +1 表示“不贪婪”的技巧,并提到它对于嵌套的
    无法正常工作。不过,我强烈建议您使用 meder 的解决方案。
  • @Filip :实际上,我也建议使用 DOM 和 loadHTML ——我在其他答案中做过几次(例如,参见stackoverflow.com/questions/1274020/…):HTML 不是可以正确解析的东西正则表达式...不够理性,我想^^
  • 你太棒了!是这样吗?我需要!刚刚插入到我已经存在的表达式中,它就像一个魅力。您可能是对的,我不应该使用正则表达式,但我可以控制输入,我只需要它来执行此操作。所以这将不得不做!再次感谢。
  • 不客气 :-) 如果您可以控制输入,并且知道您将始终获得相同类型的数据,那么,在这种情况下,我想正则表达式是可以的 ^^跨度>
【解决方案3】:

可以在http://simplehtmldom.sourceforge.net/ 找到此问题的可能答案 该课程帮助我快速解决类似问题

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签