我有这个字符串authors[0][system:id]
,我需要一个返回的正则表达式:
array('authors', '0', 'system:id')
有任何想法吗?
谢谢。
只需使用 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 )
采用最简单的方法,我们将匹配三个单独的部分。因此,首先我们要查找未包含在括号中的标记:
[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);
...你会看到你想要的结果。