正则表达式匹配多个实例

问题描述 投票:1回答:2

我将多个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实例?

php regex pcre
2个回答
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
投票

您正在使用贪婪的*运算符,它尽可能地匹配。

尝试使用.*?(懒惰运算符)而不是.*

© www.soinside.com 2019 - 2024. All rights reserved.