3

我正在尝试使用 preg_match_all 从网站上获取特定部分的出现,并且我之前已经成功地做到了这一点,但现在的不同之处在于这些部分跨越了换行符......正如我所理解的那样,我应该可以用一些修饰符来做到这一点......

因此,相关网站上的部分结构如下所示:

<div id="LICRabatGuideAftale">
    <something in between>
    <div class="clear"></div>
</div>

<div id="LICRabatGuideAftale">
    <something in between>
    <div class="clear"></div>
</div>

<div id="LICRabatGuideAftale">
    <something in between>
    <div class="clear"></div>
</div>

因此,我正在尝试使用 LICRabatGuideAftale 获取所有事件并清除...

我试过:

preg_match_all ("/LICRabatGuideAftale(.*)clear/s", $link_section, $link_array);

但它似乎没有将网站分成几个部分,而只是给了我数组中的 1 个条目......

4

3 回答 3

3

使用.*?而不是.*. 使?量词不情愿而不是贪婪,因此匹配将停在第一个 clear而不是最后一个。

使用U其他答案中建议的修饰符也是可能的。这基本上颠倒了他们的行为,.*.*?分别使他们不情愿和贪婪。

于 2013-03-29T21:19:33.427 回答
2

使用 U 选项使其变得不贪心:

preg_match_all ("`YOUR_REGEX`U", …);

大多数情况下,我使用:

preg_match_all ("`YOUR_REGEX`Uis", …);

这使得它不贪心,不区分大小写。 如果您有兴趣,
这里是 php.net 上的所有模式修饰符。

引用自php.net

U (PCRE_UNGREEDY)
这个修饰符反转量词的“贪心”,使它们默认不贪心,但如果后面跟着?它与 Perl 不兼容。它也可以通过模式内的 (?U) 修饰符设置或量词后面的问号(例如 .*?)来设置。

于 2013-03-29T21:20:33.620 回答
2

问题肯定出在 .* 与 .*?
.* 默认是贪婪的。

干得好:

preg_match_all ("/LICRabatGuideAftale(.*?)clear/s", $link_section, $link_array);

foreach($link_array[1] as $match) {
    // Clean up scraps
    $data = preg_replace('/">\n\s*|\n\s*<div class="/', "", $match);
    echo $data;
}

输出:

 - <something in between>
 - <something in between>
 - <something in between>
于 2013-03-29T21:26:51.130 回答