[英]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.