【问题标题】:how to make RegEx to match CSS non greedy for a part of the match如何使正则表达式匹配 CSS 对匹配的一部分不贪婪
【发布时间】:2013-12-24 00:05:26
【问题描述】:

我正在研究这个正则表达式来匹配 CSS 并将其替换为其他 CSS 值。 到目前为止,我有这个:

$css_new = preg_replace('/('.$definition.'.*?\s'.$property.':)[^;]*([^}]*)/is','$1 '.$value.'$2',$css_temp);

我遇到的问题是,如果我试图替换定义中的某些内容,“.menu”值也会在“.menu li”定义中被替换。

我想在某处添加一个“{”,但我没有运气。 我试过这个:

$css_new = preg_replace('/('.$definition.'{.*?\s'.$property.':)[^;]*([^}]*)/is','$1 '.$value.'$2',$css_temp);

感谢您的帮助。

【问题讨论】:

    标签: php css regex


    【解决方案1】:

    我假设$definition 总是包含整个选择器。 (请注意,在将其添加到正则表达式之前,请先替换定义中的点,否则 .menu 也会匹配 smenu

    $definition = '.submenu';
    
    // no match:
    .menu .submenu
    

    我还假设 CSS 并不完全干净(因此可能会出现双空格等)。

    .menu    .submenu {
    

    下一个假设是多个(逗号)分隔的 CSS 规则不存在(否则您将更改超过 1 个规则):

    .menu .submenu, .menu .list {
    

    那么这应该可以工作:(未完全测试)

    $cleanDefinition = str_replace(array('.', ' '), array('\.', '\s+'), $definition);
    $result = preg_replace('/((?:}|^)\s*'.$cleanDefinition.'\s*{.*'.$property.'\s*:)(.+?)(;.*?})/is', '$1'.$value.'$3', $css_temp);
    

    【讨论】:

    • 非常感谢您的帮助!除了最后一个之外,所有假设都是正确的。是否可以更改此代码以同时更改多个 comm-.separated 定义的属性?
    【解决方案2】:

    只是想报告我是如何解决这个问题的。 我能够想出这条线并对其进行了广泛的测试。

    $css_new = preg_replace('/(.*^'.$definition.'\s{.*?\s'.$property.':)[^;]*([^}]*)/ism','$1 '.$value.'$2',$css_temp);
    

    如果您发现此行有问题,请告诉我,但我相信这可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多