【问题标题】:PHP remove (conditional) duplicate row in textPHP删除(条件)文本中的重复行
【发布时间】:2012-06-06 02:00:35
【问题描述】:
$string = "Apple
Foo
Banana
...
Banana
Foo
Other text
...
Apple";

我的文本在一行“...”之后重复了单行。

之前和之后的行可以是任何东西(“Foo”),但也可以是重复的(没有“...”,如“Apple”)。

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

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

也就是说:如果与上面的“...”相同,则删除“...”后面的行

如何匹配

Banana
...
Banana

删除重复的行:

Banana

所以结果是

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

干杯!

【问题讨论】:

  • 你到现在都做了什么?你有什么代码可以开始吗?
  • Foo 仍然出现两次
  • 现在没有机会了,我知道喜欢What have you tried的人很快就会来,这些天在这里没有什么可以为你学习的。
  • 您想删除在“...”行之后重复的任何内容吗?喜欢还是副本必须直接在它的上方和下方?重复是否只出现在“...”行之后?
  • 应该删除...的行和下一行?是这样吗?

标签: php duplicate-removal


【解决方案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】:
$lines = explode("\n", $string);  
$uniqueLines = array_unique(lines);
$result = implode("\n", $uniqueLines);

【讨论】:

  • 这也删除了第二个Foo,我认为OP想要别的东西。
【解决方案3】:

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

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

表达式匹配:

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

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

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

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

【讨论】:

  • 编辑了答案以将... 放回最终字符串中
  • 很抱歉,“...”行可能会出现多次而没有重复行。
  • @Martin 看到您选择了另一个答案作为接受。我的回答对你不起作用吗?
  • @Martin 哇,这真的很奇怪,我在发布之前在本地对其进行了测试并且它工作但似乎在... 之后和行尾标记之前有空格......奇怪.. . 更新答案
  • @Martin 啊,当然是Windows换行=p正则表达式的乐趣
【解决方案4】:

我不确定我是否了解所有条件(例如,您是否可以在...之前有重复项),但$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;

【讨论】:

  • 用蛮力解决方案更新(虽然我确信有一个简洁的 RegExp 方法来解决这个问题)
  • 欢迎您!您可能应该检查 explode 在盲目地将它们附加到字符串之前返回两个项目。否则,如果输入字符串为空(或不包含换行符),您会得到一些奇怪的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2011-09-17
  • 2014-10-30
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多