Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
带preg_match_all(Regex和PHP)的嵌套模式匹配_Php_Regex - Fatal编程技术网

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

带preg_match_all(Regex和PHP)的嵌套模式匹配,php,regex,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}", "

我正在处理包含特殊标志的文本数据,其形式为“{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代码正确返回邻接数组,但分割数组只包含每个组中的最后一个匹配标志:

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

)
谢谢你的帮助

unset($results[1]);
foreach($results[0] AS $match){
    preg_match_all('/\{[a-zA-Z0-9]{1,2}}/', $match, $r);
    $results[] = $r[0];
}
这是我所知道的创建所需数据结构的唯一方法。尽管如此,preg_分割也同样有效:

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

$results[]=preg_split('/(?这里没有实际的嵌套,只是重复。除非我误解了,否则您只需要将每个标记分解。然后删除
+
和外部参数,让
preg\u match\u all
单独返回每个标记。//当然,如果您想在输入流文本中找到出现的情况,请使用原始方法,然后在第二次运行。用一个PCRE调用中断它们是不可行的,除非指定一组有限的可选令牌出现次数
({\w})?({\w})?({\w})?
。我想将每个组“{B}{R}”和“{w}{G}{U}”。我还想分别中断每个标记“{B}”、“R}”、“w}”、“G}”和“{U}”在一个单独的数组中。我想唯一的方法是运行两个正则表达式。