0

我有这个字符串authors[0][system:id],我需要一个返回的正则表达式:

array('authors', '0', 'system:id')

有任何想法吗?

谢谢。

4

2 回答 2

3

只需使用 PHP 的preg_split(),它返回一个元素数组,与 RegEx 类似explode()但使用 RegEx。

[在or上拆分字符串,]并删除提供的数组的最后一个元素(这是一个空字符串),$tokens.

编辑:另外,用 删除第三个元素array_splice($array, int $offset, int $lenth),因为这个项目也是一个空字符串。

正则表达式/[\[\]]/只是意味着匹配任何[]字符

$string = "authors[0][system:id]";
$tokens = preg_split("/[\]\[]/", $string);
array_pop($tokens);
array_splice($tokens, 2, 1);
//rest of your code using $tokens

这是$tokens运行后的格式:

Array ( [0] => authors [1] => 0 [2] => system:id ) 
于 2013-01-15T10:09:47.690 回答
1

采用最简单的方法,我们将匹配三个单独的部分。因此,首先我们要查找未包含在括号中的标记:

[a-z]+

然后我们会寻找括号和两者之间的值:

\[[^\]]+\]

然后我们将重复第二步。

您还需要添加捕获组()以提取所需的实际值。

所以当你把它们放在一起时,你会得到类似的东西:

([a-z]+)\[([^\]]+)\]\[([^\]]+)\]

然后可以使用该表达式,preg_match()并且您想要的值将被提取到传递给第三个参数的引用数组中(如this)。但是你会注意到上面的表达式是一个非常难以阅读的标点符号集合,而且结果数组上有一个我们不想要的额外元素 -preg_match()将整个匹配的字符串放在第一个索引中输出数组。我们很接近,但这并不理想。

但是,正如@AlienHoboken 正确指出并几乎正确实现的那样,更简单的解决方案是根据括号的位置拆分字符串。首先让我们看一下我们需要的表达式(或者至少是我会使用的那个):

(?:\[|\])+

这会查找至少出现一次or[并将]该块用作拆分的分隔符。这似乎正是我们所需要的,除非我们运行它时会发现我们有一个小问题:

array('authors', '0', 'system:id', '')

那个多余的空字符串是从哪里来的?好吧,输入字符串的最后一个字符与您的分隔符表达式匹配,因此它被视为拆分位置 - 结果是一个空字符串被附加到结果中。

当基于正则表达式进行拆分时,这是一个很常见的问题,幸运的是 PCRE 知道这一点并提供了一种简单的方法来避免它:PREG_SPLIT_NO_EMPTY标志。

所以当我们这样做时:

$str = 'authors[0][system:id]';
$expr = '/(?:\[|\])+/';
$result = preg_split($expr, $str, -1, PREG_SPLIT_NO_EMPTY);

print_r($result);

...你会看到你想要的结果。

看到它工作

于 2013-01-15T10:24:02.437 回答