-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

您正在扫描最多两个元素到未来,同时迭代到最后一个元素。你可以在这里看到这种情况。

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 回答