2013-03-29 113 views
3

使用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); 

,但它似乎并没有到现场分成部分,但只是给了我在数组中1项...

+0

约前修边所有新生产线是什么? – fedorqui

回答

3

使用.*?而不是.*。该?使得量词不愿意,而不是贪婪,所以比赛将在第一clear而不是最后一站。

使用U改性剂在其他答案建议也是一种可能性。这基本上颠倒了.*.*?的行为,使他们分别不情愿和贪婪。

+0

真棒,它工作!谢谢!将接受它作为答案,当SO允许我在几分钟内:) – user969043

2

让它ungreedy带U选项:

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

大多数情况下,我使用:

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

这使得它ungreedy,不区分大小写。
以下是php.net上的所有patterns modifiers,以防您感兴趣。从php.net

报价:

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

+0

伟大的技巧不区分大小写......真的有帮助:) – user969043

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> 
+0

是的,这是错误:)感谢您的foreach与额外的小提示清洁-向上... – user969043

+0

没问题。这实际上是学习贪婪与懒惰的好榜样。对你的问题+1。 – methai