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

时间:2014-07-24 06:17:46

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

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

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

现在我需要使用正则表达式使用 foobar,anotherbar ,所以我使用了这个preg_match_all

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

根据我的理解,它应该从myy开始 - 所以我将^myy-和任何字符放在此之间,因此我使用[]并以{so i used {$

结束

和这个

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

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

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

有人可以为此提供帮助吗?

2 个答案:

答案 0 :(得分:3)

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

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

查看 the Regex Demo 中的匹配项。

<强>解释

  • \.myy-匹配.myy-
  • \K告诉引擎放弃与其返回的最终匹配项目匹配的内容
  • [^{\s]+匹配任何不是{或空白字符的字符(这是匹配)
  • 前瞻(?=\s*{)断言接下来是可选的空白字符和{

要匹配整个班级,请使用:\.myy-.*?}

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

最长匹配。贪婪的.*首先匹配整个字符串,然后仅在需要时回溯以允许下一个令牌匹配。因此,您经常会超出您希望比赛结束的地方(最长匹配)。

最短匹配。懒惰.*?(由?制作&#34;懒惰&#34;)表示该点只匹配所需的字符数允许下一个标记匹配(最短匹配)。

<强>参考

答案 1 :(得分:1)

以下代码会与.myy-后的文字相匹配,直至下一个{符号

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

DEMO

以下代码会与.myy-后的文字相匹配,直至下一个{符号或:符号。

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

DEMO

<强>解释

  • \.myy-匹配字符串.myy-
  • \K会丢弃之前匹配的字符。
  • [^{]*匹配任何不是{零次或更多次的字符。
  • (?={)只有当以下字符必须是{开放式大括号时,(?=)才会被称为正面预测