2012-12-26 33 views
0

我已经格式化的文本是这样的:正则表达式匹配格式的文本在PHP

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" 想知道为什么+不会在这种情况下工作。那么我应该如何在这里形成我的模式?

+0

什么是*?m:*代表?它是否为多行表达而不匹配? – Rolice

+0

根据这个http://www.regular-expressions.info/refadv.html它应该是分组模式的多行修饰符。我使用它,所以'^'和'$'可以匹配一行文字 –

+0

您需要'/ s'修饰符而不是'/ m' –

回答

1

will do it

$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)) 
)); 

首先,它由分割Record整个数据作为分隔符使用explodearray_filter。然后,对于每个块,它使用preg_match_all提取键值对并构建关联数组(由array_combine)。

+0

谢谢!它完美的工作,即使数组组装:) –

2

你在第一次之后没有匹配换行符。移动\n(?m:...)部分

+0

嗨@Kolink,但里面(?m :)的'^'应该匹配新行的开始? –

+0

所以我用'\ n'替换了'^',整个字符串都是匹配的,但是输出数组只将'info's及其内容作为组。换句话说,只有'(。+)=(。+)'模式的最后一个匹配成组:( –

+0

@XunYang,是的,'^'确实匹配位置“行首”而不是字符。它匹配'\ n'后面的位置,而不是'\ n'本身。 – stema