与preg_match_all(Regex和PHP)匹配的嵌套模式

时间:2013-01-09 20:55:59

标签: php regex

我正在使用包含“{X}”或“{XX}”形式的特殊标志的文本数据,其中X可以是任何字母数字字符。当这些标志相邻或分开时,会为这些标志分配特殊含义。我需要一个匹配相邻标志的正则表达式并分离组中的每个标志。

例如,给出以下输入:

{B}{R}: Target player loses 1 life.
{W}{G}{U}: Target player gains 5 life.

输出应为近似值:

("{B}{R}",
 "{W}{G}{U}")

("{B}",
 "{R}")

("{W}",
 "{G}",
 "{U}")

我的PHP代码正确地返回了adjacents数组,但是split数组只包含每个组中的最后一个匹配标志:

$input = '{B}{R}: Target player loses 1 life.
{W}{G}{U}: Target player gains 5 life.';
$pattern = '#((\{[a-zA-Z0-9]{1,2}})+)#';
preg_match_all($pattern, $input, $results);
print_r($results);

输出:

Array
(
    [0] => Array
        (
            [0] => {B}{R}
            [1] => {W}{G}{U}
        )

    [1] => Array
        (
            [0] => {B}{R}
            [1] => {W}{G}{U}
        )

    [2] => Array
        (
            [0] => {R}
            [1] => {U}
        )

)

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

unset($results[1]);
foreach($results[0] AS $match){
    preg_match_all('/\{[a-zA-Z0-9]{1,2}}/', $match, $r);
    $results[] = $r[0];
}

这是我所知道的创建所需数据结构的唯一方法。通过,preg_split也可以工作:

unset($results[1]);
foreach($results[0] AS $match)
    $results[] = preg_split('/(?<=})(?=\{)/', $match);