PHP正则表达式匹配所有但不包含某些字符

时间:2018-12-09 05:01:30

标签: php regex preg-match

我尝试使所有值与/{ any string not contain "/" and "{" and "}" inside }/匹配

我的伙伴\/\{((?!\/).)*\}\/

我的测试字符串/a/{bb}/{d{b}}/{as}df}/b{cb}/a{sdfas/dsgf}

但是我的结果

array(2
    =>  array(2
    =>  /{bb}/
    =>  /{as}df}/
      )
    =>  array(2
    =>  b
    =>  f
        )
)

我只希望结果是/{bb}/,价值是bb,谢谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试与此伴侣

(?<=\/){[^\/{}]*?}(?=\/)
  

说明

  • (?<=\/)-积极回望。匹配/
  • {-匹配{
  • [^\/{}]*?-匹配除{}/以外的所有零个或多个时间(惰性模式)。
  • (?=\/)-匹配/

您也可以\/({[^\/{}]*?})\/

使用它

Demo

答案 1 :(得分:1)

我强烈建议您使用https://regex101.com/网站测试和调试正则表达式

此正则表达式将为您工作:(?<= /){([^ / {}] +?)}(?= /)

screenshot of regex101 website

答案 2 :(得分:0)

为了确保分隔斜线之间的整个子字符串是一个用花括号包裹的单独值,我建议您检查一下:

  1. 匹配以分隔斜线开头或在字符串的开头
  2. 大括号包裹的值不包含任何分隔斜线或大括号和
  3. 匹配后紧跟一个分隔斜线或在字符串的末尾。

懒惰匹配在模式中不是必需的/有益的,因为否定的字符类将防止“过度匹配”的可能性。

鳕鱼:(Demo)

$string = '/a/{bb}/{d{b}}/{as}df}/b{cb}/a{sdfas/dsgf}';

var_export(
    preg_match(
        '~(?:^|/){([^{}/]*)}(?:/|$)~',
        $string,
        $out
    )
    ? $out
    : 'no match'
);

输出:

array (
  0 => '/{bb}/',    // the fullstring match
  1 => 'bb',        // capture group 1
)