我有以下代码:
<?php
$test = "BEGIN_SESSION 7
1h+ 47
30mn-1h 20
15mn-30mn 16
5mn-15mn 43
2mn-5mn 29
30s-2mn 35
0s-30s 170
END_SESSION";
preg_match("/BEGIN_SESSION(.*)END_SESSION/is", $test, $matches);
$session = $matches[0];
preg_match('/30s-2mn ([0-9]{2})/ms', $session, $matches);
$a = $matches[1];
preg_match('/0s-30s ([0-9]{3})/ms', $session, $matches);
$b = $matches[1];
var_dump($session);
$session = preg_replace('/30s-2mn ([0-9]{2})\n0s-30s ([0-9]{3})/ms', "0s-2mn " . ($a+$b), $session);
var_dump($session);
?>
我希望功能显示$session
,如下所示:
"BEGIN_SESSION 7
1h+ 47
30mn-1h 20
15mn-30mn 16
5mn-15mn 43
2mn-5mn 29
0s-2mn 205
END_SESSION"
但相反它不会改变任何东西!我的代码有什么问题?
答案 0 :(得分:2)
你的正则表达式做了很多假设,这并不好。正则表达式应该不需要假设,但你假设在30s-2mn行中会有两位数字,你假设在0s-30s行中会有三位数,而且大多数情况下,你认为{{1用于分隔新行,而不是\n
或行上任意尾随空格。
正则表达式在这里看起来并不合适。我建议改为解析它:
\r\n
答案 1 :(得分:1)
基本PHP语法:
$session = preg_replace('/30s-2mn ([0-9]{2})\n0s-3 etc....');
^^---
PHP中的{p> \n
换行符并未作为换行符'
- 单引号字符串。 PHP将其视为字面反斜杠和文字n
,而不是换行符。
使用"
- 引用的字符串。