Я комбинирую несколько файлов CSS и записываю их в файл в отдельном каталоге. Я пытаюсь заменить относительные значения url()
для работы с новым местоположением файла, игнорируя любые абсолютные URL-адреса. Вот пример кода CSS:
#TEST {
background:url(test.jpg);
background:url( 'test.jpg' );
background:url("test.jpg" );
background:url(http://example.com/test.jpg);
background:url('https://example.com/test.jpg');
background:url("http://example.com/test.jpg");
background:url( '//example.com/test.jpg' );
background:url( "//example.com/test.jpg" );
background:url(//example.com/test.jpg);
}
Все, что не начинается с http://
, https://
или //
, должно получить $path
введен перед ним (должны совпадать только первые 3).
Желаемый результат:
#TEST {
background:url(/themes/default/css/test.jpg);
background:url( '/themes/default/css/test.jpg' );
background:url("/themes/default/css/test.jpg" );
background:url(http://example.com/test.jpg);
background:url('https://example.com/test.jpg');
background:url("http://example.com/test.jpg");
background:url( '//example.com/test.jpg' );
background:url( "//example.com/test.jpg" );
background:url(//example.com/test.jpg);
}
Однако этот кодсоответствует противоположному:
$path = '/themes/default/css/';
$search = '#url\(\s*([\'"]?)((http(s)?:)?//)#';
$replace = "url($1{$path}$2";
$css = preg_replace($search, $replace, $css);
Я знаю, что вы можете использовать что-то вроде !^(http)
to not соответствуют строкам, начинающимся с http
, но все, что я пробовал, не удалось (я === плохо разбираюсь в регулярных выражениях). Я использовал онлайн-тестер регулярных выражений, чтобы понять это, но я действительно застрял.
Это может быть не то, что я использую для решения реальной проблемы (убедиться, что пути работают в скомпилированном CSS), но может ли кто-нибудь помочь мне решить эту проблему с регулярным выражением или найти лучшее решение?