2015-10-07 140 views
0

有必要执行搜索和替换字符串在CSS文件。并找到只有标题图片。正则表达式搜索和替换路径图像在css

而搜索是这样做与

/:(\s*)url\(((.(?!.*https:|.*http:|.*base64|.*data:image))*)\)/ig 

异常,更换

:$1url(\'../dist/img/vendor/$2\') 

在这种情况下,我代替以类似的方式的路径。而我得到这个结果

background-image: url('../dist/img/vendor/"../images/preloader.gif"'); 

,需要一个字符串的

background-image: url("../images/preloader.gif"); 

得到

background-image: url('../dist/img/vendor/preloader.gif'); 

回答

0

使用CSS解析器是一个更好的方式,如果你想在其他事情,以避免报价的问题(单引号,双引号,不包括引号)。

另外,background-image CSS属性不是唯一可以包含图像文件路径的属性,因为background属性可以编译其他background-属性的所有数据。

sabberworm PHP CSS Parser一个例子,可自动包围双引号之间的路径:

require __DIR__ . '/vendor/autoload.php'; 

define('NEW_PATH', '../dist/img/vendor/'); 

$oCssParser = new Sabberworm\CSS\Parser($css); 
$oCssDocument = $oCssParser->parse(); 

$properties = ['background-image', 'background']; 

foreach($oCssDocument->getAllRuleSets() as $oRuleSet) { 
    foreach($properties as $property) { 
     $oCssRules = $oRuleSet->getRules($property); 

     foreach ($oCssRules as $oCssRule) { 
      $value = $oCssRule->getValue()->__toString(); 

      if (!preg_match('~https?:|base64|data:image~S', $value)) { 
       $value = preg_replace('~url\("\K(?:[^"/]*/)*~', NEW_PATH, $value); 
       $oCssRule->setValue($value); 
      } 
     } 
    } 
} 

echo $oCssDocument->render(Sabberworm\CSS\OutputFormat::createPretty()); 
+0

谢谢,但需要由Grunt.js替换 – vitaly63