正则表达式获取匹配开始和结束之间的字符串


regex get string between start and end of match

我正在尝试使用regex从css文件中获取类。我需要在匹配字符串的开始和结束之间上课,因为大多数类都以相同的前缀开始,如myy- classname,然后是它的规则,所以我把{作为终点,因为我只需要取类名。例如

   .myy-foobar{
         /*CSS Rules goes here*/
         }
   .myy-anotherbar{
         /*CSS Rules goes here*/
         }

现在我需要采取foobar,另一个bar使用正则表达式,所以我使用这个preg_match_all

preg_match_all('/^myy-[(.*)]{$/', $file, $match);
var_dump($match);

根据我的理解,它应该以myy开始-所以我将^myy-和任何字符放在这之间,所以我使用[]并以{结束,所以我使用{$

preg_match_all('/(myy-)(.*)({)/', $file, $match);
var_dump($match);

这里也是相同的逻辑(以myy-和任何字符开始,以{结束),我尝试了不同的语法,但没有任何帮助。

文件中有很多类,所以我只需要取所有类的中间部分,因为我已经知道前缀了。

有人能帮忙吗?

只匹配名称,使用'.myy-'K[^{'s]+(?='s*{)

$regex = '~'.myy-'K[^{'s]+(?='s*{)~';
preg_match_all($regex, $yourstring, $matches);
print_r($matches[0]);

查看Regex Demo中的匹配。

    '.myy-匹配.myy-
  • 'K告诉引擎放弃与最终匹配的匹配,它返回
  • [^{'s]+匹配任何非{或空白字符的字符(这是匹配)
  • 前瞻(?='s*{)断言后面是可选的空白字符和{

要匹配整个类,请使用:'.myy-.*?}

$regex = '~'.myy-.*?}s~';
preg_match_all($regex, $yourstring, $matches);
print_r($matches[0]);

最长的匹配。贪婪的.*首先匹配整个字符串,然后只回溯到需要允许下一个标记匹配。因此,您经常会超过您希望匹配结束的位置(最长匹配)。

最短匹配。延迟.*?(由?"延迟")意味着点只匹配允许下一个标记匹配(最短匹配)所需的尽可能多的字符。

参考

  • Regex的多级贪婪
  • 星号和加号重复

下面的代码将匹配.myy-之后的文本,直到下一个{符号

preg_match_all('~'.myy-'K[^{]*(?={)~', $file, $match);
var_dump($match);

演示

下面的代码将匹配.myy-之后的文本,直到下一个{符号或:符号。

preg_match_all('~'.myy-'K[^{:]*(?={|:)~', $file, $match);
var_dump($match);

演示

解释:

  • '.myy-匹配字符串.myy-
  • 'K丢弃先前匹配的字符。
  • [^{]*匹配非{字符0次或0次以上。
  • (?={)仅当后面的字符必须是{左花括号时使用。(?=)称为正向正向查找