Регулярное выражение preg_replace() для сопоставления относительных путей url() в файлах CSS

Я комбинирую несколько файлов 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), но может ли кто-нибудь помочь мне решить эту проблему с регулярным выражением или найти лучшее решение?

7
задан Wesley Murch 21 March 2012 в 04:16
поделиться