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

行「...」の後に単一の行が重複しているテキストがあります。

その前後の行は何でもかまいません(「Foo」)が、重複することもできます(「Apple」のように「...」なし)。

「...」行は、その後に重複する行がなくても複数回表示される可能性があります。

間に「...」行がある重複行のみを削除したい。

つまり、上記の「...」と同じ場合は、「...」の後の行を削除します。

どうすれば一致させることができますか

Banana
...
Banana

重複した行を削除するには:

Banana

結果は

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

乾杯!

4

4 に答える 4

1

文字列内の重複を削除する方法は次のとおりです。

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

explode()array_unique()改行で文字列を配列に変換し、結果の配列を呼び出して、文字列をimplode().

出力:

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

ただし、目的の出力が問題の定義と競合するため、出力が目的の出力と完全に一致しないことに注意してください。

デモ

于 2012-06-04T14:12:28.410 に答える
1
$lines = explode("\n", $string);  
$uniqueLines = array_unique(lines);
$result = implode("\n", $uniqueLines);
于 2012-06-04T14:11:41.263 に答える
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;
于 2012-06-04T14:12:51.623 に答える
0

タスクが 3 つのドットの行に続く行を削除するだけの場合:

echo preg_replace("/^(.+?)\r?\n(\.{3})\r?\n\\1/m", "\\1\n\\2", $string);

式は次のように一致します。

  • 少なくとも 1 文字を含む行全体 (1)
  • 1 行に 3 つのドット (2)
  • 少なくとも 1 文字を含む行全体 (1)

/m修飾子は、複数行モードを選択するために使用され、行の開始と終了の意味を持ちます^$

後方参照は、\\13 つのドットの前にあったものと一致させるために使用されます。

'\\1'一致した行を 3 つのドットに戻すには、置換が必要です。

于 2012-06-04T14:25:06.243 に答える