2013-03-29 170 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