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