如何解决如何以一个字符为增量拆分字符串,又如何使括号之间的字符串完整无缺?
所以,说我有这样的字符串:
abcd[efg]hi[jkl]m
我想要的是对字符串进行拆分,使得每个字符都放在数组中自己的索引中,括号中的字符除外。他们应该保持在一起。换句话说,我想像这样从输入字符串创建一个数组:
[0] => a
[1] => b
[2] => c
[3] => d
[4] => efg
[5] => h
[6] => i
[7] => jkl
[8] => m
我知道我可以使用preg_split('/[\[]*[\][]/U',$value,-1)
如下所示分割输入字符串:
[0] => abcd
[1] => efg
[2] => hi
[3] => jkl
[4] => m
但是,我不知道我需要使用正则表达式来获得所需的确切信息。什么正则表达式会给我我想要的解决方案?
解决方法
有效地,您拆分了每个“可选出现的”方括号表达式。 IOW,如果遇到方括号表达式,则在整个表达式上拆分(不使用它),如果没有遇到表达式,则在字符串中的该位置拆分。
该模式可能看起来像以下任意一种:(Regex Demo)
~\[([^\]]+)]|~ # (shorter pattern,44 steps on the sample input string)
或
~(?:\[([^\]]+)])?~ # (longer pattern,64 steps on the sample input string)
两个preg标志都是必不可少的,以确保在此过程中不会丢失任何子字符串并且不会生成任何空元素。
代码:(Demo)
$string = 'abcd[efg]hi[jkl]m';
var_export(
preg_split(
'~\[([^\]]+)]|~',$string,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
)
);
输出:
array (
0 => 'a',1 => 'b',2 => 'c',3 => 'd',4 => 'efg',5 => 'h',6 => 'i',7 => 'jkl',8 => 'm',)
模式细分:
~ #starting pattern delimiter
\[ #literal opening square brace
( #open capturing group
[^\]]+ #match one or more non-closing square braces
) #close capturing group
] #literal closing square brace
| #OR operator,to allow a match on current position (not a brace expression)
~
文字大括号写在内部捕获组的外部,以便在拆分期间将其丢弃/使用。通常,内部捕获组也将被使用,但是PREG_SPLIT_DELIM_CAPTURE
标志要求该子字符串在拆分后应保留。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。