正则表达式,用于捕获PHP

时间:2019-05-20 11:12:44

标签: php regex preg-match-all regex-lookarounds regex-greedy

我试图通过正则表达式模式从字符串中获取值, 可以,但是它会返回所有匹配的字符串(我的意思是也带有{}的字符串)

这是字符串:

dashboard/admin/{content}/category/{category}/posts

正则表达式模式:

/{(.*?)}/

,PHP代码为:

    preg_match_all('/{(.*?)}/', $url, $matches, PREG_SET_ORDER, 0);

$matches的内容为:

array:2 [
  0 => array:2 [
    0 => "{content}"
    1 => "content"
  ]
  1 => array:2 [
    0 => "{category}"
    1 => "category"
  ]
]

但是我想要一个像这样的数组:

array:2 [
  0 => "content",
  1 => "category"
]

3 个答案:

答案 0 :(得分:2)

使用环顾四周:

$url = 'dashboard/admin/{content}/category/{category}/posts';
preg_match_all('/(?<={).*?(?=})/', $url, $matches, PREG_SET_ORDER, 0);
print_r($matches);

输出:

Array
(
    [0] => Array
        (
            [0] => content
        )

    [1] => Array
        (
            [0] => category
        )

)

答案 1 :(得分:1)

删除PREG_SET_ORDER,以使索引按捕获组排序。

preg_match_all('/{(.*?)}/', 'dashboard/admin/{content}/category/{category}/posts', $matches);

使用$matches[1],因为1将是第一个捕获组。 0索引将完全匹配。

答案 2 :(得分:0)

您可以利用\K和一个正面正向断言来断定右边的是}

{\K[^}]+(?=})

Regex demo

$url = 'dashboard/admin/{content}/category/{category}/posts';
preg_match_all('/{\K[^}]+(?=})/', $url, $matches);
print_r($matches[0]);

结果:

Array
(
    [0] => content
    [1] => category
)

Php demo