如何使用preg_replace()替换CSS文件中的指定样式内容?
现有代码的问题
- 正则里的
\b在双引号字符串中会被PHP解析为退格符,无法起到单词边界的作用,导致匹配不到primaryColour开头的目标内容。 - 正则字符集仅包含小写字母
[a-z0-9...],但目标颜色值#AD9DF4是大写字母格式,直接匹配失败。 - 文件读写操作放在内层循环,每次遍历样式设置都会重复读写同一个文件,浪费IO资源。
修正后的实现代码
$settings['new_primary_colour_ccs'] = '#777777'; // 目标替换颜色 foreach($appPats as $path){ // 仅读取一次文件内容 $content = file_get_contents($path); $styleSettings = [ 'primary_colour' => [ // 用单引号包裹正则避免转义问题,补充大写字母和#以覆盖颜色值字符 'reg' => '/\bprimaryColour:\s?[\'"]([a-fA-F0-9# ,._+;()@!?&#:\/-]+)[\'"]/', 'string' => 'primaryColour: "' . $settings['new_primary_colour_ccs'] . '"' ] ]; foreach ($styleSettings as $style) { $content = preg_replace($style['reg'], $style['string'], $content); } // 仅写入一次修改后的内容 file_put_contents($path, $content); var_dump($content); }
核心调整说明
- 正则修复:用单引号包裹正则表达式,确保
\b正常作为单词边界生效;字符集加入A-F和#,覆盖十六进制颜色值的所有可能字符,不管原颜色是大写还是小写都能匹配。 - IO优化:将文件读写操作移到外层循环,避免重复读写同一个文件,提升执行效率。
- 匹配精准度:正则能准确匹配
primaryColour:后带单/双引号的任意合法颜色值,替换后保持原有的双引号格式。
针对你提供的目标文本片段,修正后的代码会精准定位到primaryColour:"#AD9DF4",并替换为primaryColour:"#777777",完全满足替换需求。
内容的提问来源于stack exchange,提问作者Alex Kizyma
相关产品推荐
相关产品推荐

