【问题标题】:regex get string between start and end of match正则表达式获取匹配开始和结束之间的字符串
【发布时间】:2014-09-15 13:49:52
【问题描述】:

我正在尝试使用正则表达式从 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- 以及介于两者之间的任何字符,所以我使用了 [] 并以 { 结尾,所以我使用了 {$

还有这个

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

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

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

有人可以帮忙吗?

【问题讨论】:

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


    【解决方案1】:

    要匹配名称,请使用\.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]);
    

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

    最短匹配。惰性.*?(由? 设置为“惰性”)表示点仅匹配允许下一个标记匹配所需的字符数(最短匹配)。

    参考

    【讨论】:

    • 是的,您的答案有效 +1。但它也得到myy 我不想要这个,我有一些像.myy-some:before {} 这样的伪css 类,在这种情况下我只需要some 我需要采用在{ 之间结束的字符串以及: 可以这可能吗?
    • 仅供参考,完成了正则表达式的调整并添加了解释。 :)
    • 谢谢,这是需要的,但我需要两个端点,比如它可能以{: 结尾,所以我这么说。 @AvinashRaj 给出了他的答案,它有效。
    【解决方案2】:

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

    【讨论】:

    • 感谢 +1 的帮助。它可以有两个端点吗? { 以及 :
    • 你的意思是,它可能是.myy-foobar{.myy-foobar:
    • 是的,我就是这个意思
    • 你能解释一下\K为什么我们需要丢弃以前的东西,因为有更多的类。但是我们得到的所有课程都很好,我只是在问。即使我们使用\k,它如何获得所有匹配的类
    • 这样我们就可以得到完全匹配,否则.myy- 将包含在最终结果中。没有\Kregex101.com/r/vM7wT6/5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多