PHP删除(条件)文本中的重复行

时间:2012-06-04 14:07:02

标签: php duplicate-removal

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

我有一行文字,其中单行在“......”行之后重复。

之前和之后的行可以是任何内容(“Foo”),但也可以是重复的(没有像“Apple”那样的“......”)。

“...” - 行可以多次出现而后面没有重复的行。

我只想删除中间有“......”行的重复行。

换句话说:如果它与上面的“......”相同,则删除“......”之后的行

我如何匹配

Banana
...
Banana

删除重复的行:

Banana

所以结果是

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

干杯!

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

以下是如何删除字符串中的重复

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

explode()将字符串转换为换行符中的数组,在结果数组上调用array_unique(),然后将该字符串与implode()一起重新加入。

<强>输出:

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

但请注意,输出与您想要的输出不完全匹配,因为您想要的输出与您对问题的定义冲突。

Demo

答案 2 :(得分: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;

答案 3 :(得分:0)

如果任务是删除三行后面的行:

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

表达式匹配:

  • 包括至少一个字符(1)
  • 的整行
  • 单行上的三个点(2)
  • 包括至少一个字符(1)
  • 的整行

/m修饰符用于选择多行模式,其中^$表示行的开头和结尾的含义。

\\1后引用用于匹配三个点之前的任何内容。

需要替换'\\1'以将匹配的行放回三个点。