Регулярное выражение соответствует нескольким экземплярам - PullRequest
1 голос
/ 01 апреля 2019

Я объединил и минимизировал несколько файлов 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 ]

4 голосов
/ 01 апреля 2019

Вы должны использовать это регулярное выражение,

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

И удалите его с пустой строкой

Демо

Кроме того, в своем регулярном выражении (@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

1 голос
/ 01 апреля 2019

Вы используете жадный оператор *, который пытается найти максимально возможное совпадение.

Попробуйте использовать .*? (ленивый оператор) вместо .*.

...