-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
$lines = explode("\n", $string);  
$uniqueLines = array_unique(lines);
$result = implode("\n", $uniqueLines);
于 2012-06-04T14:11:41.263 回答
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 回答
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

如果任务只是删除带有三个点的行之后的行:

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

表达式匹配:

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

/m修饰符用于选择多行模式,其中and^带有$行首和行尾的含义。

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

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

于 2012-06-04T14:25:06.243 回答