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


PHP remove (conditional) duplicate row in text

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

我有在一行"..."之后重复单行的文本。

之前和之后的行可以是任何内容("Foo"),也可以是重复的(没有"..."比如"苹果")。

"..."行可以多次出现,后面没有重复的行。

我只想删除带有"..."行中间。

换句话说:删除"..."如果与上述"..."

如何匹配

Banana
...
Banana

删除重复的行:

Banana

所以结果是

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

干杯!

以下是删除字符串中重复的方法:

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

explode()字符串到换行符上的数组中,在生成的数组上调用 array_unique(),然后将字符串与 implode() 连接在一起。

输出:

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

但是,请注意,输出并不完全匹配所需的输出,因为所需的输出与问题的定义冲突。

演示

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

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

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

表达式匹配:

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

/m修饰符用于选择多行模式,其中^$承载行的开始和结束的含义。

''1 背面引用用于匹配三个点之前的任何内容。

需要替换'''1'将带有三个点的匹配线放回去。

我不确定我是否了解所有条件(你能在...例如),但是$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;