2017-04-25 86 views
2

讓我們說下發生之前捕獲的一切,這是我的琴絃組:在全球正則表達式搜索

HOME 
    this 
    could 
    have 
    many 
    lines 
HOME 
    this 
    one 
    also 
HOME 
    same 

我怎樣才能得到一切包含這種新的生產線的「家」的下一次出現之前(縮短簡便起見)

echo $matches[0]; // first home outputs 'this\n could\n have\n many\n lines\n' 
echo $matches[1]; // second home outputs 'this\n one\n also\n' 
echo $matches[2]; // third home outputs 'same\n' 
// ... HOME(n) 

我迄今爲止嘗試:/HOME(.*?)\n(.*?)/gU但我只得到了字符串的第一行:

echo $matches[0]; // outputs 'this' 
echo $matches[1]; // outputs 'this' 
echo $matches[2]; // outputs 'same' 
// ... HOME(n) 

注:兩個家庭之間的串可具有可變的行數,這是什麼讓我頭疼

+0

這是問題的片段:https://regex101.com/r/6TPpDJ/1 - 爲更清晰的視圖 –

+0

我更喜歡MaxZoom的答案否則我會與[**'(?:^ HOME |( (!:(!!HOME)。+ \ R *)*'**](https://regex101.com/r/6TPpDJ/3) – revo

+1

或者' preg_split()'在'HOME'或類似的情況下,如果需要regex,但explode()會更好。 – AbraCadaver

回答

2

使用preg_split方式如下:

preg_split('~^(?=HOME$)~m', $s, -1, PREG_SPLIT_NO_EMPTY) 

請參閱PHP demo

詳細

  • ^ - 匹配一行
  • (?=HOME$)的開始 - 如果行等於HOME

所以,代碼分裂的積極先行檢查該行的開始等於HOME

PREG_SPLIT_NO_EMPTY空結果從結果中省略。如果我們添加另一個前視圖,這可能會被避免:preg_split('~^(?!\A)(?=HOME$)~m', $s)

+1

證明是最有效的代碼之後,我已根據自己的需要調整了代碼。 (y) –

1

您可以使用此正則表達式和搶捕獲組#1:

/\bHOME\s+(.*?)(?=\sHOME\s|\z)/s 

Regex Demo

正則表達式破碎:

  • \b - 斷言字邊界
  • HOME - 匹配文字文本HOME
  • \s+ - 1以上空白
  • (.*?) - 匹配0或更多匹配換行符也
  • (?=任意字符 - 啓動先行的匹配
    • \sHOME\s - 匹配文字文本HOME用空格包圍
    • | - OR
    • \z - 輸入結束
  • ) - 前瞻結束
+1

正則表達式分解真的幫助我。 :) –

+0

請不要猶豫,以糾正「幾個漏洞」 –

+1

在我的回答中,我已經在開始時使用字邊界照顧他們,並在前面的'HOME'前使用'\ s'來確保我們匹配'HOME '但不是'HOMELY' – anubhava

2

代替正則表達式,你可以使用preg-split功能

$str = "HOME 
    this 
    could 
    have 
    many 
    lines 
HOME 
    this 
    one 
    also 
HOME 
    same"; 

$parts = preg_split('/HOME/', $str, -1, PREG_SPLIT_NO_EMPTY); 
print_r($parts); 

這是DEMO

1

這將是一個辦法:

HOME\s+(.*)(?=HOME|$) 

一些猜測包括:(我想你不會首先要換行;)

它抓住一切HOME單行後,它的換行,直至下一文本HOME結束。

See it here at regex101

+0

正是我在找的......'/ HOME \ s +(。*)(?= HOME | $)/ gsU'簡單而乾淨,它的作用就像一個魅力。^_^ –

+1

@FarizLuqman:看看[這個正則表達式演示](https://regex101.com/r/b4l8sf/1)vs [mine](https://regex101.com/r/xyHX0q/1)。在這種情況下,惰性點匹配不是最有效的解決方案。 –