在换行符中使用preg_match_all

时间:2013-03-29 21:16:23

标签: php regex preg-match-all

我正在尝试使用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);

但它似乎没有将网站拆分成各个部分,但只是在数组中给了我一个条目......

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

不同意U选项:

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

大多数情况下,我使用:

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

这使得它不合适,不区分大小写。
以下是php.net上的所有patterns modifiers,如果你有兴趣的话。

引自php.net

  

U(PCRE_UNGREEDY)
这个修饰符会反转量词的“贪婪”,这样它们在默认情况下不会贪婪,但会变成   贪婪,如果跟着?它与Perl不兼容。它也可以   由模式内的(?U)修饰符设置或问题设置   在量词后面标记(例如。*?)。

答案 2 :(得分: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>