$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;