我正在尝试用以下字符串构建一个类似于下面的数组的正则表达式
$str = 'Hello world [something here]{optional}{optional}{optional}{n possibilities of this}';
到目前为止,我有/^(\*{0,3})(.+)\[(.*)\]((?:{[a-z ]+})?)$/
Array
(
[0] => Array
(
[0] => Hello world [something here]{optional}{optional}{optional}{n possibilities of this}
[1] =>
[2] => Hello world
[3] => something here
[4] => {optional}
[5] => {optional}
[6] => {optional}
[7] => ...
[8] => ...
[9] => {n of this}
)
)
对此有什么好处?感谢
答案 0 :(得分:0)
我认为你需要两个步骤。
(.+)\[(.+)\](.+)
会为您Hello world
,something here
和{optional}...{optional}
。
将\{(.+?)\}
应用于上一步中的最后一个元素将为您提供可选的参数。
答案 1 :(得分:0)
我相信这种方法比你要求的更清洁:
代码:(PHP Demo)(Pattern Demo)
$str = 'Hello world [something here]{optional}{optional}{optional}{n possibilities of this}';
var_export(preg_split('/ *\[|\]|(?=\{)/',$str,NULL,PREG_SPLIT_NO_EMPTY));
输出:
array (
0 => 'Hello world',
1 => 'something here',
2 => '{optional}',
3 => '{optional}',
4 => '{optional}',
5 => '{n possibilities of this}',
)
preg_split()
将在三次可能发生的情况下破坏您的字符串(在此过程中删除这些事件):
*\[
表示零个或多个空格后跟一个左方括号。\]
表示结束方括号。?=\{)
表示零长度字符(前一个位置......)一个开头的花括号。 *我的模式在]
和{
之间生成一个空元素。为了消除这个无用的元素,我在函数调用中添加了PREG_SPLIT_NO_EMPTY
标志。