正则表达式匹配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))
));