Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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,我将文本格式化如下: Record name=aaa age=16 info=blabla bla Record name=bbb age=15 info=foo bar foo bar 希望在PHP中将其转换为带有正则表达式的数组。到目前为止,我已经尝试: preg_match_all("/Record.*\n(?m:^(.+)=(.+)$)+/",$text,$matches); 但它只捕获“Record name=aaa”和“Record name=bbb” 想知道为什么+在这种情况

我将文本格式化如下:

Record
name=aaa
age=16
info=blabla bla

Record
name=bbb
age=15
info=foo bar foo bar
希望在PHP中将其转换为带有正则表达式的数组。到目前为止,我已经尝试:

preg_match_all("/Record.*\n(?m:^(.+)=(.+)$)+/",$text,$matches);
但它只捕获
“Record name=aaa”
“Record name=bbb”

想知道为什么
+
在这种情况下不起作用。那么我应该如何在这里形成我的模式呢?

您没有匹配第一行之后的换行符。将
\n
移动到
(?m:…)
部分中

如果第一行之后没有匹配换行符。将
\n
移动到
(?m:…)
部分的内部

首先,它使用and将整个数据拆分为
记录
作为分隔符。然后,对于每个块,它使用提取键值对,并构造一个关联数组(by)

这个


首先,它使用and将整个数据拆分为
记录
作为分隔符。然后,对于每个块,它使用提取键值对,并构造一个关联数组(by)

m:为什么?它是没有匹配的多行表达式吗?根据这一点,它应该是分组模式的多行修饰符。我使用它是为了让
^
$
可以匹配您需要的
/s
修饰符的一行文本,而不是
/m
再次投票反对regex。这是可以用一个简单的lexer来完成的。是的,它炸了我的头:)需要更多的解释为什么我应该在这里使用单行修饰语…是什么?m:为什么?它是没有匹配的多行表达式吗?根据这一点,它应该是分组模式的多行修饰符。我使用它是为了让
^
$
可以匹配您需要的
/s
修饰符的一行文本,而不是
/m
再次投票反对regex。这是一个简单的lexer可以完成的。是的,它让我大吃一惊:)需要更多解释为什么我应该在这里使用单行修饰符…嗨@Kolink,但是里面的
^
应该匹配新行的开头(?m:)所以我用
\n
替换了
^
,整个字符串都匹配了,但输出数组只将
info
s及其内容作为组。换句话说,只有
(.+)=(.+)
模式中的最后一个匹配为组:(@XunYang,是的,
^
与“行的开始”位置匹配)但不是一个字符。它与
\n
后面的位置匹配,但与
\n
本身不匹配。@XunYang发生这种情况是因为捕获组没有存储所有匹配的内容。它只有存储最后一个内容的存储。好吧!似乎这就是正则表达式的工作方式,我无法用正则表达式解决我的问题。谢谢答案仍然是:)Hi@Kolink,但是内部的
^
应该匹配新行的开头?所以我用
\n
替换了
^
,整个字符串都是匹配的,但输出数组只将
信息及其内容作为组。换句话说,只有
(.+)=(.+)
模式中的最后一个匹配为组:(@XunYang,是的,
^
与“行的开始”位置匹配)但不是一个字符。它与
\n
后面的位置匹配,但与
\n
本身不匹配。@XunYang发生这种情况是因为捕获组没有存储所有匹配的内容。它只有存储最后一个内容的存储。好吧!似乎这就是正则表达式的工作方式,我无法用正则表达式解决我的问题。谢谢答案仍然是:)谢谢!即使在组装阵列的情况下,它也能完美地工作:)谢谢!即使组装了阵列,它也能完美工作:)
$data = array_values(array_map(
    function($e){
        preg_match_all('/(.*?)=([^\r\n]*)/', $e, $m); 
        return array_combine($m[1], $m[2]);
    }, 
    array_filter(explode("Record", $text))
));