-1

ラインを持つ

(01) Some text
(10) Foo Bar
(11) ?
(13) Foo Bar
(13) ?
(20) Something else

4行をまとめてチェック。行 1 と 3 が同じで、行 2 と 4 が(XX) ?である場合、行 2 ~ 4 を に置き換え...て、

(01) Some text
(10) Foo Bar
...
(20) Something else

コード:

$arr = explode("\n", $t);
if ( count($arr) > 3 )  {
    for ($i=1; $i<count($arr); $i++) { // check 4 rows
        if( ($arr[$i-1] == $arr[$i+1]) // if row 1 and 3 are the same
           && preg_match('/\(\d+\) \?$/', $arr[$i]) // and row 2 is "(XX) ?"
        && preg_match('/\(\d+\) \?$/', $arr[$i+2])  // and row 4 is "(XX) ?"
       ) {
            print "Match!"; //test. later replace rows 2-4 with a row "..."
         }
     }
}

これにより、現在オフセットエラーが発生します。

テスト: http://codepad.viper-7.com/iMO3BW

これはどのように解決できますか?

4

2 に答える 2

0

最後の要素まで反復しながら、最大 2 つの要素を未来に向かってスキャンしています。ここでそれが起こっているのを見ることができます。

preg_match('/\(\d+\) \?$/', $arr[$i+2])

FOR ステートメントを次のように変更します。

for($i=1; $i<count($arr) - 2; $i++)
于 2012-11-04T13:48:28.590 に答える
0

正規表現パターンを使用

^(\(\d+\)\s+)(.*)[\n\r]\(\d+\)\s+\?[\n\r]\(\d+\)\s+\2[\n\r]\(\d+\)\s+\?[\n\r]

複数行およびグローバル修飾子を使用。


この正規表現テストを参照してください。

于 2012-11-04T14:24:08.417 に答える