在方括号内的每个字符上分割

时间:2018-06-29 09:07:51

标签: php regex

我对正则表达式有疑问,我有以下字符串

[date|Y-m-d]

这是从文本中提取的令牌,我需要提取'date'和'Y-m-d',但是我无法使用以下正则表达式来实现我的目标,有人可以帮我

(?:\[)([^\|]+)(?:\])

令牌可以像:

[date|Y-m-d] \\ should extract 'date' and 'Y-m-d'
[date|Y-m-d|today] \\ should extract 'date', 'Y-m-d' and 'today'

3 个答案:

答案 0 :(得分:3)

您也可以通过使用ltrim()和rtrim()除去括号来实现此目的。然后,可以将explode与“:”一起使用。

$str = explode(':', ltrim( rtrim($str, ']'), '['));
print_r( $str );

输出:

Array
(
    [0] => date
    [1] => Y-m-d
)

答案 1 :(得分:2)

我假设您可能在括号内包含字符串 那些子字符串,并且您想提取它们。

您可以使用

$str = '[date|Y-m-d] [date|Y-m-d|today]';
preg_match_all('/\[([^][]+)]/', $str, $matches);
$res = [];
foreach ($matches[1] as $m) {
    array_push($res,explode("|", $m));
}
print_r($res);

请参见PHP demo

对于预期每个字符串只有1个匹配项(PHP demo)的情况,请参见相同的解决方案:

$str = 'A single match example [date|Y-m-d|today] here.';
if (preg_match('/\[([^][]+)]/', $str, $matches)) {
    print_r(explode("|", $matches[1]));
}

详细信息

  • '/\[([^][]+)]/'模式提取其中不包含[]的方括号之间的所有文本(将没有前/后括号的部分捕获到第1组中)
  • 然后通过使用|展开每个匹配项来构建数组。

如果您只有等于[...|...|...|etc.]的字符串,则可以使用Shivrudra's approach,也可以使用非常简单的preg_match_all

$str = '[date|Y-m-d]';
preg_match_all('/[^][|]+/', $str, $matches);
print_r($matches[0]);

请参见another PHP demo

[^][|]+模式匹配[]|以外的1个或多个字符。参见the regex demo

答案 2 :(得分:-1)

使用正则表达式模式

(?<=^\[|\|)[^|\[\]]*(?=\||\]$)

测试此正则表达式解决方案here和相关的PHP代码here