[英]Improving a working regex to match multiple lines
我正在尝试从旧的 DOS 转储中匹配用户,以便他们可以迁移到新的东西。 它们以%
符号开头并以]
结尾。 有些在一条线上,有些在多条线上。
https://regex101.com/r/0h5ndW/1
我的正则表达式%([^\%]*)]
有效,但是有没有更好的方法来 select 每个用户从%
到]
(包括%
和]
)所以我可以将它们通过preg_replace
并稍后操作它们?
我对多线部分有点怀疑。
Expected Output
%user:100 [ type=admin, added=10/12/1997, last-login:10/20/1997, total-logins:45, status:1 ]
%user:111 [ type=user, added=10/12/1997, last-login:10/27/1997, total-logins:145, status:1 ]
%user:112 [ type=viewer, added=10/12/1997, last-login:10/23/1997, total-logins:6, status:1 ]
%user:113 [ type=viewer, added=10/12/1997, last-login:10/14/1997, total-logins:2, status:1]
%user:114 [ type=viewer, added=10/12/1997, last-login:10/14/1997, total-logins:1, status:1]
%user:115 [ type=viewer, added=10/12/1997, last-login:10/12/1997, total-logins:1, status:1 ]
原始数据
%user:100 [
type=admin,
added=10/12/1997,
last-login:10/20/1997,
total-logins:45,
status:1
]
%user:111 [
type=user,
added=10/12/1997,
last-login:10/27/1997,
total-logins:145,
status:1
]
%user:112 [ type=viewer, added=10/12/1997,
last-login:10/23/1997,
total-logins:6,
status:1
]
%user:113 [ type=viewer, added=10/12/1997, last-login:10/14/1997, total-logins:2, status:1]
%user:114 [ type=viewer, added=10/12/1997, last-login:10/14/1997, total-logins:1,
status:1]
%user:115 [ type=viewer, added=10/12/1997, last-login:10/12/1997, total-logins:1,
status:1
]
您可以使用此正则表达式进行搜索:
((?:^%|(?!\A)\G).*)\R(?=[^][]*])
并将其替换为:
$1
PHP 代码:
$repl = preg_replace('/((?:^%|(?!\A)\G).*)\R(?=[^][]*])/m', '$1', $str);
正则表达式详细信息:
(
: 开始捕获组 #1
(?:^%|(?!\A)\G)
:在行开头匹配%
或从前一个匹配的结尾重新开始匹配。 \G
断言 position 在前一个匹配的结尾或第一个匹配的字符串的开头。.*
:匹配同一行中的所有内容)
: 结束捕获组 #1\R
: 匹配任何类型的换行符(?=[^][]*])
:确保前面有一个]
,中间没有匹配[
或]
。作为正则表达式的替代方法,这只是使用]
拆分数据。 然后修剪每一行并用空格替换新行(使用PHP_EOL
)......
$output = explode("]", $data);
array_pop($output);
array_walk($output, function(&$data) {
$data = str_replace(PHP_EOL, " ", trim($data)."]");
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.