棘手的php字符串匹配

时间:2011-12-01 04:40:09

标签: php regex

我有一个看起来像这样的字符串:

[2005]
one 
two
three
[2004]
six

最顺畅的是从它获得一个看起来像这样的数组:

array(
    ['2005'] => "one \n two \n three",
    ['2005'] => "six",
)

...或者甚至可能将内部数组切成行数组......

我尝试使用preg_split,虽然有效,但没有给出关联数组键,所以我没有年份数字作为键。

在没有遍历所有行的情况下,有没有很酷的方法呢?

3 个答案:

答案 0 :(得分:2)

/(\[[0-9]{4}\])([^\[]*)/会告诉你日期和下一个日期之后的事情。

使用组创建数组:使用preg_match_all(),您将获得$ matches数组,其中$ matches [1]是日期,$ matches [2]是其后的数据。

答案 1 :(得分:1)

使用Sylverdrag的正则表达式作为指南:

<?php
$test = "[2005]
one
two
three
[2004]
six";

$r = "/(\[[0-9]{4}\])([^\[]*)/";
preg_match_all($r, $test, $m);
$output = array();
foreach ($m[1] as $key => $name)
{
    $name = str_replace(array('[',']'), array('',''), $name);
    $output[ $name ] = $m[2][$key];
}

print_r($output);
?>

输出(PHP 5.2.12):

Array
(
    [2005] =>
one
two
three

    [2004] =>
six
)

答案 2 :(得分:0)

这稍微复杂一些:

preg_match_all('/\[(\d+)\]\n((?:(?!\[).+\n?)+)/', $ini, $matches, PREG_SET_ORDER);

(可以通过了解真实的格式约束来简化。)