有线
(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
怎么能解决这个问题?
答案 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 。