Php preg#u match#u all';或';操作人员
我无法从字符串中获取“today”值。模式是将字符串放在双花括号内,并将字符串放在双花括号外 我只得到“内部”值。模式是:Php preg#u match#u all';或';操作人员,php,regex,preg-match-all,Php,Regex,Preg Match All,我无法从字符串中获取“today”值。模式是将字符串放在双花括号内,并将字符串放在双花括号外 我只得到“内部”值。模式是: /({{(?P<inside>[^}{]+)}}|}}(?P<outside>[^}{]+){{)/ php代码是: $returnValue = preg_match_all('/({{(?P<inside>[^}{]+)}}|}}(?P<outside>[^}{]+){{)/', '{{Friday}}today{{Su
/({{(?P<inside>[^}{]+)}}|}}(?P<outside>[^}{]+){{)/
php代码是:
$returnValue = preg_match_all('/({{(?P<inside>[^}{]+)}}|}}(?P<outside>[^}{]+){{)/', '{{Friday}}today{{Sunday}}', $matches);
上面的数组中没有关于“今天”的内容
有趣的是,当模式的各个部分相互替换时,结果中没有“Sunday”或“Suterday”值,只有“today”
看起来只考虑模式的第一部分。
获取所有值的模式是什么? 多谢各位 编辑: 1. 谢谢你的回答。但我必须把问题扩大一点。我测试了你的所有命题,它们对字符串很有用 {{Friday}}today{{Sunday}}
但它们不适用于这样的字符串:
{{Friday}}t{od{a}y{{Sunday}}
结果中应该有这样一个值
t{od{a}y
因为只有双卷括号才应该使用delimeters
我试图使您的优秀模式适应这一要求,但没有成功。子字符串“}}”和“{{”应该被求反。不仅仅是单个的“{”或“}”
如何得到它
2.
另一个不太重要的问题是“内部”和“外部”结果数组不应该有空字符串。请参见图片上我的意思:
(?我已经管理好了。空字符串的问题仍然存在。单大括号不会造成问题
(?<={{)(?P<THINGS>((?<!}}).)+)(?=}})|((?<=}})(?P<AREA>((?<!{{).)+)(?={{))|(?P<AREA2>^((?<!{{).)+)(?={{)|(?<=}})(?P<AREA3>((.)+$))
(?结果数组:
array (
0 =>
array (
0 => 'Fo{rest',
1 => 'Go{l}d',
2 => 'Beach',
3 => 'Monay',
4 => 'Grass',
5 => 'Diamond',
6 => 'S{ea',
),
'THINGS' =>
array (
0 => '',
1 => 'Go{l}d',
2 => '',
3 => 'Monay',
4 => '',
5 => 'Diamond',
6 => '',
),
1 =>
array (
0 => '',
1 => 'Go{l}d',
2 => '',
3 => 'Monay',
4 => '',
5 => 'Diamond',
6 => '',
),
2 =>
array (
0 => '',
1 => 'd',
2 => '',
3 => 'y',
4 => '',
5 => 'd',
6 => '',
),
3 =>
array (
0 => '',
1 => '',
2 => 'Beach',
3 => '',
4 => 'Grass',
5 => '',
6 => '',
),
'AREA' =>
array (
0 => '',
1 => '',
2 => 'Beach',
3 => '',
4 => 'Grass',
5 => '',
6 => '',
),
4 =>
array (
0 => '',
1 => '',
2 => 'Beach',
3 => '',
4 => 'Grass',
5 => '',
6 => '',
),
5 =>
array (
0 => '',
1 => '',
2 => 'h',
3 => '',
4 => 's',
5 => '',
6 => '',
),
'AREA2' =>
array (
0 => 'Fo{rest',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
),
6 =>
array (
0 => 'Fo{rest',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
),
7 =>
array (
0 => 't',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
),
'AREA3' =>
array (
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => 'S{ea',
),
8 =>
array (
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => 'S{ea',
),
9 =>
array (
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => 'S{ea',
),
10 =>
array (
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => 'a',
),
)
排列(
0 =>
排列(
0=>'Fo{rest',
1=>'Go{l}d',
2=>“海滩”,
3=>“Monay”,
4=>“草”,
5=>“钻石”,
6=>'S{ea',
),
“事物”=>
排列(
0 => '',
1=>'Go{l}d',
2 => '',
3=>“Monay”,
4 => '',
5=>“钻石”,
6 => '',
),
1 =>
排列(
0 => '',
1=>'Go{l}d',
2 => '',
3=>“Monay”,
4 => '',
5=>“钻石”,
6 => '',
),
2 =>
排列(
0 => '',
1=>d',
2 => '',
3=>“y”,
4 => '',
5=>d',
6 => '',
),
3 =>
排列(
0 => '',
1 => '',
2=>“海滩”,
3 => '',
4=>“草”,
5 => '',
6 => '',
),
“区域”=>
排列(
0 => '',
1 => '',
2=>“海滩”,
3 => '',
4=>“草”,
5 => '',
6 => '',
),
4 =>
排列(
0 => '',
1 => '',
2=>“海滩”,
3 => '',
4=>“草”,
5 => '',
6 => '',
),
5 =>
排列(
0 => '',
1 => '',
2=>‘h’,
3 => '',
4=>s',
5 => '',
6 => '',
),
“区域2”=>
排列(
0=>'Fo{rest',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
),
6 =>
排列(
0=>'Fo{rest',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
),
7 =>
排列(
0=>“t”,
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
),
“区域3”=>
排列(
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6=>'S{ea',
),
8 =>
排列(
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6=>'S{ea',
),
9 =>
排列(
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6=>'S{ea',
),
10 =>
排列(
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6=>“a”,
),
)
php代码:
$returnValue = preg_match_all('/(?<={{)(?P<THINGS>((?<!}}).)+)(?=}})|((?<=}})(?P<AREA>((?<!{{).)+)(?={{))|(?P<AREA2>^((?<!{{).)+)(?={{)|(?<=}})(?P<AREA3>((.)+$))/', 'Fo{rest{{Go{l}d}}Beach{{Monay}}Grass{{Diamond}}S{ea', $matches);
$returnValue=preg_match_all('/((((+$))/,'Fo{rest{{Go{l}d}}海滩{{Monay}}草地{{Diamond}S{ea',$matches);
以下是:
$re=“/{{(?.*}}}}}}}|(?[^{}]*(?:{{(?!{)[^{}]*}(?!})[^{}]*)/”;
$str=“{星期五}今天{星期日}”;
预匹配全部($re,$str,$MATCHS);
打印(数组过滤器($matches[“outer”]);
打印(数组过滤器($matches[“inner”]);
为什么看起来这么复杂?
正则表达式包含两个备选方案,一个用于将{{
和}}
内的所有子字符串捕获到组“内部”,组“外部”捕获除{{
和}
内的子字符串以外的所有子字符串
第一部分:
{{(?.*?}}
这将查找并使用{
子字符串,后跟除换行符以外的零个或多个字符(在正则表达式末尾使用/s
dotall修饰符也匹配换行符),零个或多个出现(使用+?
匹配一个或多个),尽可能少(意味着我们在第一个}
处停止)。然后,}
已匹配
第二部分:
(?[^{}]*(?:{(?!{)[^{}]*}(?!})[^{}]*)*)
此子模式等同于(?(?:(?!{{{(?)}{code>)*)
,但它是此模式的展开版本(因此比具有两个备选方案的调和贪婪令牌更有效)。它只匹配非大括号[^{}]*
(零或更多)后跟零或更多序列(=可选匹配){
后面不跟另一个{
或}
后面不跟另一个}
,然后是零个或多个非大括号
从生成的数组中删除空元素
这里有一个不是你需要的吗?只要得到所有不是{
或}
。或者也应该可以。Wiktor,这是个好主意。非常简单。即使它没有将结果分配给“外部”和“内部”键。但这可以用php进行管理。谢谢。检查。如果这是您需要的,我明天会尽快发布。干得好。这正是我需要的。我真的非常感谢您的帮助。即使对于这样一个stri,它也能工作ng:“星期五星期日”。为什么要在字符类中列出空格和美元符号?要使其安全可靠,因为我没有得到任何关于输入字符串如何变化以及外部日期可能也在行/字符串末尾的信息。在字符类中,$
只是美元符号。如果要避免匹配行分隔符,请使用de>\v
(垂直白色包装)
array (
0 =>
array (
0 => 'Fo{rest',
1 => 'Go{l}d',
2 => 'Beach',
3 => 'Monay',
4 => 'Grass',
5 => 'Diamond',
6 => 'S{ea',
),
'THINGS' =>
array (
0 => '',
1 => 'Go{l}d',
2 => '',
3 => 'Monay',
4 => '',
5 => 'Diamond',
6 => '',
),
1 =>
array (
0 => '',
1 => 'Go{l}d',
2 => '',
3 => 'Monay',
4 => '',
5 => 'Diamond',
6 => '',
),
2 =>
array (
0 => '',
1 => 'd',
2 => '',
3 => 'y',
4 => '',
5 => 'd',
6 => '',
),
3 =>
array (
0 => '',
1 => '',
2 => 'Beach',
3 => '',
4 => 'Grass',
5 => '',
6 => '',
),
'AREA' =>
array (
0 => '',
1 => '',
2 => 'Beach',
3 => '',
4 => 'Grass',
5 => '',
6 => '',
),
4 =>
array (
0 => '',
1 => '',
2 => 'Beach',
3 => '',
4 => 'Grass',
5 => '',
6 => '',
),
5 =>
array (
0 => '',
1 => '',
2 => 'h',
3 => '',
4 => 's',
5 => '',
6 => '',
),
'AREA2' =>
array (
0 => 'Fo{rest',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
),
6 =>
array (
0 => 'Fo{rest',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
),
7 =>
array (
0 => 't',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => '',
),
'AREA3' =>
array (
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => 'S{ea',
),
8 =>
array (
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => 'S{ea',
),
9 =>
array (
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => 'S{ea',
),
10 =>
array (
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
5 => '',
6 => 'a',
),
)
$returnValue = preg_match_all('/(?<={{)(?P<THINGS>((?<!}}).)+)(?=}})|((?<=}})(?P<AREA>((?<!{{).)+)(?={{))|(?P<AREA2>^((?<!{{).)+)(?={{)|(?<=}})(?P<AREA3>((.)+$))/', 'Fo{rest{{Go{l}d}}Beach{{Monay}}Grass{{Diamond}}S{ea', $matches);
$re = "/{{(?<inner>.*?)}}|(?<outer>[^{}]*(?:{(?!{)[^{}]*|}(?!})[^{}]*)*)/";
$str = "{{Friday}}today{{Sunday}}";
preg_match_all($re, $str, $matches);
print_r(array_filter($matches["outer"]));
print_r(array_filter($matches["inner"]));