2014-11-01 20 views
0

[已解決]我需要實現刪除正則表達式模式,該模式與在內容中的多個位置強分佈的多行匹配,但要排除第一個起始關鍵字START_KEY_ONE和最後結束關鍵字END_KEY_ONE之間的部分。PHP排除多行出現的多行模式

一般來說,這裏是例子的代碼:

$content = <<<EOS 
Line 1 
Line 2 
/* START_KEY_ONE */ 
Line 3 
Line 4 
Line 5 
/* END_KEY_ONE */ 
Line 6 
Line 7 
/* START_KEY_TWO */ 
Line 8 
/* END_KEY_TWO */ 
Line 9 
Line 10 
/* START_KEY_ONE */ 
Line 11 
Line 12 
/* END_KEY_ONE */ 
Line 13 
/* START_KEY_TWO */ 
Line 14 
/* END_KEY_TWO */ 
Line 15 
EOS; 

// $needle = '#/\* START_KEY_ONE.*END_KEY_ONE \*/\R#s'; // non working pattern 
$needle = '#/\* START_KEY_ONE.*?END_KEY_ONE \*/\R#s'; // working pattern 
echo preg_replace($needle,'',$content); 

而不是這個(工作模式):

Line 1 
Line 2 
Line 6 
Line 7 
/* START_KEY_TWO */ 
Line 8 
/* END_KEY_TWO */ 
Line 9 
Line 10 
Line 13 
/* START_KEY_TWO */ 
Line 14 
/* END_KEY_TWO */ 
Line 15 

我在得到這個(非工作模式):

Line 1 
Line 2 
Line 13 
/* START_KEY_TWO */ 
Line 14 
/* END_KEY_TWO */ 
Line 15 

回答

1
\/\*\s*START_KEY_ONE.*?END_KEY_ONE \*\/ 

試試這個。看demo.Replace w ith empty string

查看演示。

http://regex101.com/r/jI8lV7/4

$re = "/\\/\\*\\s*START_KEY_ONE.*?END_KEY_ONE \\*\\//s"; 
$str = "Line 1\nLine 2\n/* START_KEY_ONE */\nLine 3\nLine 4\nLine 5\n/* END_KEY_ONE */\nLine 6\nLine 7\n/* START_KEY_TWO */\nLine 8\n/* END_KEY_TWO */\nLine 9\nLine 10\n/* START_KEY_ONE */\nLine 11\nLine 12\n/* END_KEY_ONE */\nLine 13\n/* START_KEY_TWO */\nLine 14\n/* END_KEY_TWO */\nLine 15"; 
$subst = ""; 

$result = preg_replace($re, $subst, $str); 
+0

謝謝!你發現缺少細節(問號在模式中間)。 解決的問題(空字符串\ s和轉義斜槓沒有影響我的原始模式)。 – urosevic 2014-11-01 09:51:43

+0

@urosevic歡迎:) – vks 2014-11-01 09:52:41

+0

它給你一個空行.. – 2014-11-01 09:54:53

1

更改您的正則表達式如下圖所示,然後更換比賽用空字符串。不要忘記將s DOTALL修飾符添加到您的正則表達式中。

'~/\*\h+START_KEY_ONE\h+\*/.*?END_KEY_ONE\h+\*/\n~s' 

你必須要在最後添加\n,這樣你就不會得到輸出一個空行。

DEMO

代碼:

$content = <<<EOS 
Line 1 
Line 2 
/* START_KEY_ONE */ 
Line 3 
Line 4 
Line 5 
/* END_KEY_ONE */ 
Line 6 
Line 7 
/* START_KEY_TWO */ 
Line 8 
/* END_KEY_TWO */ 
Line 9 
Line 10 
/* START_KEY_ONE */ 
Line 11 
Line 12 
/* END_KEY_ONE */ 
Line 13 
/* START_KEY_TWO */ 
Line 14 
/* END_KEY_TWO */ 
Line 15 
EOS; 
$needle = '~/\*\h+START_KEY_ONE\h+\*/.*?END_KEY_ONE\h+\*/\n~s'; 
echo preg_replace($needle,'',$content); 

輸出:

Line 1 
Line 2 
Line 6 
Line 7 
/* START_KEY_TWO */ 
Line 8 
/* END_KEY_TWO */ 
Line 9 
Line 10 
Line 13 
/* START_KEY_TWO */ 
Line 14 
/* END_KEY_TWO */ 
Line 15 

DEMO

+0

也謝謝你!我更新了有問題的代碼。 – urosevic 2014-11-01 09:55:21

+0

但我的正則表達式將工作。 – 2014-11-01 09:57:59

+0

當然它工作:) – urosevic 2014-11-01 10:01:17

2

你可以使用這種模式:

~^\Q/* START_KEY_ONE */\E\R(?>.*\R)*?\Q/* END_KEY_ONE */\E\R?~m 

的主要興趣是因爲它每行而不是每個字符一次只發生一次懶惰量詞的成本降低。另一個優點是m修飾符和^定位點(該模式僅在行的開頭進行測試,而不是針對每個字符)。使用\Q...\E可避免轉義特殊字符並使模式更具可讀性。