$string = "Apple
Foo
Banana
...
Banana
Foo
Other text
...
Apple";
我有一行文字,其中单行在“......”行之后重复。
之前和之后的行可以是任何内容(“Foo”),但也可以是重复的(没有像“Apple”那样的“......”)。
“...” - 行可以多次出现而后面没有重复的行。
我只想删除中间有“......”行的重复行。
换句话说:如果它与上面的“......”相同,则删除“......”之后的行
我如何匹配
Banana
...
Banana
删除重复的行:
Banana
所以结果是
$string = "Apple
Foo
Banana
...
Foo
Other text
...
Apple";
干杯!
答案 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
但请注意,输出与您想要的输出不完全匹配,因为您想要的输出与您对问题的定义冲突。
答案 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);
表达式匹配:
/m
修饰符用于选择多行模式,其中^
和$
表示行的开头和结尾的含义。
\\1
后引用用于匹配三个点之前的任何内容。
需要替换'\\1'
以将匹配的行放回三个点。