php中的正则表达式preg_match | preg_match_all

时间:2010-05-03 19:57:32

标签: php preg-match preg-match-all

我正在尝试用以下字符串构建一个类似于下面的数组的正则表达式

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

对此有什么好处?感谢

2 个答案:

答案 0 :(得分:0)

我认为你需要两个步骤。

  1. (.+)\[(.+)\](.+)会为您Hello worldsomething here{optional}...{optional}

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

答案 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标志。