Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 改进工作正则表达式以匹配多行_Php_Regex - Fatal编程技术网

Php 改进工作正则表达式以匹配多行

Php 改进工作正则表达式以匹配多行,php,regex,Php,Regex,我正在尝试匹配来自旧DOS转储的用户,以便将他们迁移到新的位置。它们以%开头,以“]结尾。一些在一条线上,另一些在多条线上 我的正则表达式%[^\%]*]可以工作,但是有没有更好的方法来选择从%开始到]的每个用户,包括%和],以便我可以将它们放入preg_replace并在以后操作它们 我对多行部分有点怀疑 预期产量 原始数据 您可以使用此正则表达式进行搜索: ((?:^%|(?!\A)\G).*)\R(?=[^][]*]) 并将其替换为: $1 PHP代码: 正则表达式详细信息: :启动捕

我正在尝试匹配来自旧DOS转储的用户,以便将他们迁移到新的位置。它们以%开头,以“]结尾。一些在一条线上,另一些在多条线上

我的正则表达式%[^\%]*]可以工作,但是有没有更好的方法来选择从%开始到]的每个用户,包括%和],以便我可以将它们放入preg_replace并在以后操作它们

我对多行部分有点怀疑

预期产量

原始数据


您可以使用此正则表达式进行搜索:

((?:^%|(?!\A)\G).*)\R(?=[^][]*])
并将其替换为:

$1
PHP代码:

正则表达式详细信息:

:启动捕获组1 ?:^%|?!\A\G:在行开始处匹配%或从上一个匹配结束处重新启动匹配\G在前一个匹配的末尾或第一个匹配的字符串的开头断言位置。 *:将所有内容匹配在同一行中 :结束捕获组1 \R:匹配任何类型的换行符 ?=[^][]*]:确保我们前面有一个]而中间没有匹配的[或]。
作为regex的替代方法,这只是使用[1]分割数据。然后修剪每一行并使用PHP_EOL用空格替换新行

$output = explode("]", $data);
array_pop($output);
array_walk($output, function(&$data) {
    $data = str_replace(PHP_EOL, " ", trim($data)."]");
});

另一种选择是使用一种模式的变体,您尝试使用一个否定字符类来匹配%并从开始[直到结束]

然后根据匹配删除换行符

^%[^][]*\[[^][]*]$
解释

^字符串开头 %[^][]*匹配除[或]以外的任何字符的%和0+倍 \[[^][]*]匹配从[到结束] $Assert字符串结尾 |

比如说


两个小的观察结果。。。在正则表达式演示中,]似乎不匹配,%用户:113根本不匹配。。。这正常吗?这两种行为都是需要的。1. ] 不应匹配,因为我们之前删除了换行符]。2%用户:113不匹配,因为它已经在一行中。确定。我觉得有些不对劲。
$repl = preg_replace('/((?:^%|(?!\A)\G).*)\R(?=[^][]*])/m', '$1', $str);
$output = explode("]", $data);
array_pop($output);
array_walk($output, function(&$data) {
    $data = str_replace(PHP_EOL, " ", trim($data)."]");
});
^%[^][]*\[[^][]*]$
$result = preg_replace_callback("/^%[^][]*\[[^][]*]$/m", function($m) {
    return str_replace(PHP_EOL, "", $m[0]);
}, $data);