我对正则表达式有疑问,我有以下字符串
[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'
答案 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)