Php 抓取{…}内的所有字符(如果不包含“);{“和”};

Php 抓取{…}内的所有字符(如果不包含“);{“和”};,php,regex,pcre,regex-negation,Php,Regex,Pcre,Regex Negation,我想捕获{…}中的所有字符 如果找不到内部“{”和“}” 例如: {amdnia91(\+wowa} 抓住它 {amdn{ia91(\+wowa} 未捕获(包含“{”) 如何修复它 编辑。 详细说明: 我将尝试创建css迷你程序。 但在这里,我需要捕获括号内的所有名称和内容作为单独的数组值 Curret$输入如下所示: .something{property:value;prop2:value}#something2{someprop:val;prop:val} 它也被切碎,因此包含多个内

我想捕获
{…}
中的所有字符

如果找不到内部“
{
”和“
}

例如:

{amdnia91(\+wowa}
抓住它

{amdn{ia91(\+wowa}
未捕获(包含“
{
”)

如何修复它

编辑。 详细说明:

我将尝试创建css迷你程序。 但在这里,我需要捕获括号内的所有名称和内容作为单独的数组值

Curret$输入如下所示:

.something{property:value;prop2:value}#something2{someprop:val;prop:val}
它也被切碎,因此包含多个内联…{}…{}。 我的代码很好,但是。。。 如果在支架内,则该锁扣也会在支架内,
但是如果里面包含括号,我不想抓住它。

我发布了一个替代daiscog发布的正则表达式的方法,基于匹配我们不需要的内容并省略它的概念,并且只在PCRE
(*跳过)(*失败)的帮助下匹配我们以后需要的内容。
动词:

[#.]?[^{}]*{[^{}]*[{}][^{}]*}(*SKIP)(*F)|[#.]?[^{}]*{([^{}]+)}

它与什么匹配?

  • [#].]?[^{}]*{[^{}]*[^{}][^{}]*}(*SKIP)(*F)
    -可选的
    (请参见
    [#]
    )后跟0+个字符,而不是
    {
    (请参见
    ^[{}]*//code>),后跟一个
    {/code>,再后跟一个
    {/code>{
    }
    (请参见
    [{}]
    )然后再次
    [^{}]*
    和结束语
    }
    。此部分匹配字符串,如
    。某物{
    或无。然后,匹配后,从由于
    (*跳过)(*失败)
    动词而返回的匹配中放弃此匹配
  • |
    -或
  • [#.]?[^{}]*{([^{}]+}
    -可选的
    (请参见
    [#.]?
    ),后跟0+字符,而不是
    {/code>和
    }
    (请参见
    [^{}*
    ),然后是
    {/code>,然后是1+个字符,而不是大括号(
    {{{{{code>})和大括号
    。这是我们将保留并作为匹配项获取的内容
:

结果:

Array
(
    [0] => Array
        (
            [0] => {amdnia91(+wowa}
            [1] => 
.something{property:value;prop2:value}
            [2] => #something2{someprop:val;prop:val}
            [3] => #something2{someprop:val;prop:val}
            [4] => #something2{someprop:val;prop:val}
        )

    [1] => Array
        (
            [0] => amdnia91(+wowa
            [1] => property:value;prop2:value
            [2] => someprop:val;prop:val
            [3] => someprop:val;prop:val
            [4] => someprop:val;prop:val
        )

)

[^}{]
表示匹配任何不是}或{的字符

因此:

但是,请注意,在
{amdn{ia91(+wowa}
示例中,这将匹配
ia91(+wowa
片段

编辑

如果对于第二个示例,您根本不想进行任何匹配,请尝试以下操作:

preg_match_all('#^[^}{]*\{([^}{]+)\}[^}{]*$#', $input, $output);
regex细分意味着:

  • ^
    -行的开始
  • [^}{]*
    -不是{或}零次或多次的任何字符
  • \{
    -文字{字符
  • ([^}{]+)
    -捕获一个或多个非{或}字符
  • \}
    -文字}字符
  • [^}{]*
    -不是{或}零次或多次的任何字符
  • $
    -行尾

第二次编辑

鉴于您对所需内容的进一步解释,我建议:

preg_match_all('#(?<=^|})[^}{]*?\{([^}{]+?)\}(?=[^}]*$|[^}]*\{)#', $input, $output);

preg_match_all(“#”)(?你的意思是如果
{
内部有一个
{…}
,你根本不想匹配吗?甚至不想匹配它的一部分?我只想在{…}内部找不到{和}时匹配,否则匹配。让我澄清一下:可以吗?daiscog的答案几乎相同。是的,这将是可以的。-不知道这是否是预期的。实际上,懒惰量词没有任何意义,它与贪婪量词的工作方式相同。是的。我将删除它。@daiscog。但我只想在括号内找不到其他括号时获得$output。@KsaR是的,作为我的answer说,这就是
[^}{]+
的意思-它意味着匹配一个或多个不是{或}的字符。但如果括号内的括号…而不是其他字符,则不能匹配内容。因此,如果括号内找到括号,则不能捕捉它(您的代码捕捉)…但如果没有在括号内找到,则捕获完整内容。我取消删除了我的答案,因为您希望匹配
ia91(+wowa
inside
{amdn{ia91(+wowa}
。这是我的正则表达式的一部分。您需要在这里使用惰性量词,否则
{abc}def}
将匹配捕获组中的
abc}def
preg_match_all('#\{([^}{]+)\}#', $input, $output);
preg_match_all('#^[^}{]*\{([^}{]+)\}[^}{]*$#', $input, $output);
preg_match_all('#(?<=^|})[^}{]*?\{([^}{]+?)\}(?=[^}]*$|[^}]*\{)#', $input, $output);