正则表达式匹配多个实例

时间:2019-04-01 06:23:06

标签: php regex pcre

我已将多个CSS文件合并并缩小为一个字符串,如下所示:

@import "path/to/file1";.my-class{font-size:24px;}@import "path/to/file2";

但是现在我想“关闭”导入。因此,我想删除@import "something";的所有实例并获取此信息:

.my-class{font-size:4px;}

我目前正在使用此

echo preg_replace("(@import \".*\";)", "", $minified_css);

但这将替换整个字符串。即,它不会在";的第一个实例处停止并重新启动。

如何获取正则表达式来替换单个@import实例?

2 个答案:

答案 0 :(得分:4)

您最好使用此正则表达式,

@import\s+"[^"]+";

并使用空字符串将其删除

Demo

此外,在正则表达式(@import \".*\";)中避免使用( ),因为在用空字符串替换正则表达式时,您不需要无用地分组。另外,请避免使用.*,否则它将与所有可能的内容贪婪地匹配,并且可能会给您带来意想不到的结果。

尝试此PHP代码段,

$minified_css = '@import "path/to/file1";.my-class{font-size:24px;}@import "path/to/file2";';
echo preg_replace('/@import\s+\"[^"]+\";/', '', $minified_css);

打印

.my-class{font-size:24px;}

我认为您不需要在g中使用全局preg_replace修饰符,因为默认情况下会发生这种情况,您可以通过传递第三个参数来控制替换编号。另外,您无需使用m多行修饰符,因为我们无需在模式中使用开始/结束锚点。

PHP code demo

答案 1 :(得分:1)

您正在使用贪婪的*运算符,该运算符试图尽可能匹配。

尝试使用.*?(惰性运算符)代替.*