2012-06-04 37 views
-2
$string = "Apple 
Foo 
Banana 
... 
Banana 
Foo 
Other text 
... 
Apple"; 

我有文本,其中單行復制後行「...」。PHP刪除(有條件的)文本中的重複行

之前和之後的行可以是任何東西(「Foo」),但也可以是重複的(沒有「...」就像「Apple」)。

「...」 - 行可以多次出現,而不會出現重複行。

我只想刪除中間有「...」行的重複行。

換句話說:後刪除行「......」如果是與上述相同的「...」

我怎樣才能匹配

Banana 
... 
Banana 

去除重複行:

Banana 

所以結果是

$string = "Apple 
Foo 
Banana 
... 
Foo 
Other text 
... 
Apple"; 

乾杯!

+1

你到底做了些什麼?你有任何代碼從頭開始? – Eineki

+2

'Foo'依然出現兩次 –

+1

現在再也沒有機會了,我知道那些喜歡'你試過了'的人會很快來到這裏來,現在沒有什麼可以爲你學習的東西。 – Sarfraz

回答

0

如果任務是隻刪除行下面有三個點的行:

​​

表達式匹配:

  • 一整行包括至少一個字符(1)
  • 在一行上三個點(2)
  • 一整行包括至少一個字符(1)

/m改性劑被用來選擇多行模式,其中^$帶有行的開始和結束的含義。

\\1反向引用用於匹配三點之前的任何內容。

需要更換'\\1'以將匹配線放回三個點。

+0

編輯將'...'放回最終字符串的答案 –

+0

對不起,「...」 - 行可能會出現多次而沒有重複行。 – Martin

+0

@Martin好的,更新了我的回答 –

1
$lines = explode("\n", $string); 
$uniqueLines = array_unique(lines); 
$result = implode("\n", $uniqueLines); 
+0

這也消除了第二個'Foo',我想OP想要別的東西。 –

1

下面是如何,你可以在字符串中刪除重複

$string = implode("\n", array_unique(explode("\n", $string))); 

explode()串入的新行數組,調用array_unique()所產生的陣列上,並加入字符串返回連同implode()

輸出:

Text row A 
Foo 
Text row B 
... 
Text row C 

但是,請注意,輸出並不完全匹配您所需的輸出,與你的問題的定義所需輸出衝突。

Demo

+0

這很嚇人 – danneth

+0

對不起,我的例子不夠清楚。我只想刪除中間有「...」行的重複行。 – Martin

0

我不知道我理解所有的條件(你可以有之前的重複...例如),但如何$string = implode("\n", array_unique(explode("\n", $string)));

更新 蠻力解決方案:

$string = "Apple\nFoo\nBanana\n...\nBanana\nFoo\nOther text\n...\nApple\n"; 
$string2 = ""; 

$arr = explode("\n", $string); 

$string2 .= $arr[0] . "\n"; 
$string2 .= $arr[1] . "\n"; 

for ($i=2; $i<count($arr); $i++) 
{ 
    if ($arr[$i-1] != '...' || $arr[$i-2] != $arr[$i]) 
    { 
     $string2 .= $arr[$i] . "\n"; 
    } 

} 

echo $string2; 
+0

我編輯了我的頂級帖子,使其更加清晰。 – Martin

+0

更新了一個蠻力解決方案(雖然我敢肯定有一個簡潔的RegExp方式來解決這個問題) – danneth

+0

耶! :) 非常感謝! – Martin