0

我正在尝试提出一个正则表达式,它从以下字符串构造一个看起来像下面的数组

$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}
        )
)

什么是一个好的方法?谢谢

4

2 回答 2

0

我认为您将需要两个步骤。

  1. (.+)\[(.+)\](.+)会得到你Hello worldsomething here{optional}...{optional}

  2. 应用\{(.+?)\}到上一步中的最后一个元素将为您提供可选参数。

于 2010-05-03T20:44:00.297 回答
0

这是一种我认为比您要求的更清洁的方法:

代码:(PHP 演示)(模式演示

$str = 'Hello world [something here]{optional}{optional}{optional}{n possibilities of this}';

var_export(preg_split('/ *\[|\]|(?=\{)/', $str, 0, 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在函数调用中添加了标志。

于 2017-10-26T04:28:18.920 回答