我正在尝试使用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);
但它似乎没有将网站拆分成各个部分,但只是在数组中给了我一个条目......
答案 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>