PHP正则表达式:检查文本行是否有重复的行

时间:2012-11-04 13:43:37

标签: php regex

有线

(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

怎么能解决这个问题?

2 个答案:

答案 0 :(得分:0)

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

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

将FOR语句更改为以下内容。

for($i=1; $i<count($arr) - 2; $i++)

答案 1 :(得分:0)

使用正则表达式模式

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

使用多行全局修饰符。


请参阅 this regex test