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

Php 正则表达式获取匹配开始和结束之间的字符串,php,regex,preg-match,preg-match-all,Php,Regex,Preg Match,Preg Match All,我正在尝试使用正则表达式从css文件中获取类。我需要在匹配字符串的开始和结束之间取类,因为大多数类都是以相同的前缀开始的,比如myy-classname,后跟它的规则,所以我将{作为结束点,因为我只需要取类名。 比如说 .myy-foobar{ /*CSS Rules goes here*/ } .myy-anotherbar{ /*CSS Rules goes here*/ } 现在我需要使用regex获取f

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

   .myy-foobar{
         /*CSS Rules goes here*/
         }
   .myy-anotherbar{
         /*CSS Rules goes here*/
         }
现在我需要使用regex获取foobar,另一个,所以我使用了这个preg\u match\u 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*{)

查看中的匹配项

解释

  • \.myy-
    匹配
    .myy-
  • \K
    告诉引擎放弃与其返回的最终匹配项相距甚远的匹配项
  • [^{\s]+
    匹配任何不是
    {
    或空白字符的字符(这是匹配项)
  • lookahead
    (?=\s*{)
    断言下面是可选的空白字符和
    {
要匹配整个类,请使用以下命令:
\.myy-.*?}

$regex = '~\.myy-.*?}s~';
preg_match_all($regex, $yourstring, $matches);
print_r($matches[0]);
最长匹配。贪婪的
*
首先匹配整个字符串,然后仅在需要时回溯以允许下一个标记匹配。因此,您通常会超出希望匹配结束的位置(最长匹配)

最短匹配。延迟
*?
(由
设置为“延迟”)意味着点只匹配允许下一个标记匹配(最短匹配)所需的字符数

参考


要仅匹配名称,请使用
\.myy-\K[^{\s]+(?=\s*{)

查看中的匹配项

解释

  • \.myy-
    匹配
    .myy-
  • \K
    告诉引擎放弃与其返回的最终匹配项相距甚远的匹配项
  • [^{\s]+
    匹配任何不是
    {
    或空白字符的字符(这是匹配项)
  • lookahead
    (?=\s*{)
    断言下面是可选的空白字符和
    {
要匹配整个类,请使用以下命令:
\.myy-.*?}

$regex = '~\.myy-.*?}s~';
preg_match_all($regex, $yourstring, $matches);
print_r($matches[0]);
最长匹配。贪婪的
*
首先匹配整个字符串,然后仅在需要时回溯以允许下一个标记匹配。因此,您通常会超出希望匹配结束的位置(最长匹配)

最短匹配。延迟
*?
(由
设置为“延迟”)意味着点只匹配允许下一个标记匹配(最短匹配)所需的字符数

参考


    • 以下代码将与
      .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
        丢弃以前匹配的字符
      • [^{]*
        匹配任何不属于
        {
        的字符零次或多次
      • (?={)
        仅当以下字符必须是
        {
        开放式花括号时。
        (?=)
        称为正向前瞻

        • 以下代码将与
          .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
            丢弃以前匹配的字符
          • [^{]*
            匹配任何不属于
            {
            的字符零次或多次
          • (?={)
            仅当以下字符必须是
            {
            开放式花括号时。
            (?=)
            称为正向前瞻

          是的,你的答案是+1。但是它也得到了
          myy
          我不想要这个,我有一些类似
          的伪css类。myy some:before{}
          在这种情况下,我只需要
          一些
          我需要取
          之间结束的字符串{
          以及
          这可能吗?仅供参考,调整完正则表达式并添加了解释。:)谢谢,这是我需要的,但我需要两个端点,就像它可能以
          结尾一样{
          所以我说了。@AvinashRaj给出了他的答案,它是有效的。是的,你的答案有效+1。但它也得到了
          myy
          我不想要这个,我有一些伪css类,比如
          。myy some:before{}
          在这种情况下,我只需要
          一些
          我需要取
          之间结束的字符串{
          以及
          这可能吗?仅供参考,调整完正则表达式并添加了解释。:)谢谢,这是我需要的,但我需要两个端点,就像它可能以
          {
          结束一样。@AvinashRaj给出了他的答案,它是有效的。感谢+1的帮助。它能有两个端点吗。
          {
          以及
          你的意思是,它可能是
          .myy foobar{
          .myy foobar:
          Y