1

私のテキスト(...実際の一部です):

(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

4

1 に答える 1

1

正規表現では、最初から CRLF は必要ありません。

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

サイクルの前に配列をソートできるため、互いに横にあるアイテムをチェックするだけで十分です。

sort($arr);

于 2013-01-05T14:11:11.797 に答える