PHP:匹配重复的文本行,同时忽略一些前缀

时间:2013-01-05 13:50:09

标签: php duplicate-removal

我的文字(...是其实际部分):

(01) Text here
(02) sometimes also (with brackets)
(03) foo
(05) and [other stuff!?]
...
(07) foo
(08) bar
(09) bar

找到重复的行(XX) foo(XX) bar并打印出来。

//workaround
$tNormalized = preg_replace('/(*ANYCRLF)^\(\d+\) /m', '(??) ', $t);

$arr = explode("\n", $tNormalized);
if ( count($arr) > 1 )  {
    for ($i=1; $i<count($arr); $i++) {
        if( $arr[$i-1] == $arr[$i] ) {
            echo "Match:<br>";
            echo $arr[$i-1];
            echo $arr[$i];
        }
  }
}

期望的结果:

Match:
(03) foo
(07) foo

Match:
(08) bar
(09) bar
  • 问题1 :匹配重复行,同时忽略行开头括号中的数字。我想在括号中打印数字。将它们标准化为“(??)”只是一种解决方法。
  • 问题2 if( $arr[$i-1] == $arr[$i] ):这会检查上一行。但也请检查$arr[$i-2]$arr[$i-3]等。

测试:http://codepad.viper-7.com/4IQV8x

1 个答案:

答案 0 :(得分:1)

在你的正则表达式中,你不需要在开始时使用任何CRLF。

preg_replace('/^\(\d+\) /m', '(??) ', $t);

您可以在循环之前对数组进行排序,以便检查彼此之外的项目就足够了。

sort($arr);