Як перерахувати шляхи url css при переміщенні його в іншу папку

Який найкращий спосіб перекладу CSS, щоб він працював на іншому шляху. Я подивився на кілька різних бібліотек (CrushCSS, minify), і вони, здається, тільки над цією службою, а також стисканням файлів (які я не хочу робити).

Чи є кращим регулярним виразом? Якщо так, то якими є всі можливі випадки, які мені доведеться звертатися?

For example, input: /base/my.css

@import url "../another/file.css"
#container {
    background: url('example/relative/path.png');
}
#container2 {
    background: url('/example/absolute/path.png');
}

Expected output: /base/example/path/my.css

@import url "../../../another/file.css"
#container {
    background: url('../relative/path.png');
}
#container2 {
    background: url('/example/absolute/path.png');
}

EDIT:

Я не зацікавлений у "найкращих практиках" чи способах уникнути подібних проблем. Мені цікаво лише, як зробити перетворення, щоб CSS залишався правильним на новому шляху.

1

2 Відповіді

Я б сказав, що найкращий спосіб полягає в тому, щоб завжди використовувати URL-адреси відносно кореня вашого сайту. /example/absolute/path.png завжди буде працювати незалежно від того, де ви розміщуєте файл CSS.

2
додано
Вони завжди будуть/щось. У вашому власному домені або субдомені вони будуть відносно/і якщо ви перебуваєте в підкаталозі, то вони будуть/підкаталогами.
додано Автор GordonM, джерело
У такому випадку я думаю, що у вас є лише два реалістичних варіанти. 1) Створіть символічні посилання у місці b, що вказують на файли в місці a, тож обидва шляхи до відповідного ресурсу є дійсними або b) замінити файл CSS на PHP-скрипт, який виводить файл CSS з перерахованими шляхами, коли це необхідно. Я рекомендую перший, оскільки останній викличе проблеми з кешуванням таблиці стилів.
додано Автор GordonM, джерело
Це не вибір, оскільки CSS-файли вже існують. Я шукаю спосіб їх програмного переміщення, зберігаючи їх у дійсності.
додано Автор Kendall Hopkins, джерело
Також у моєму випадку я не можу використовувати абсолютні шляхи, оскільки база сайту не гарантується /.
додано Автор Kendall Hopkins, джерело
У моєму випадку сайт можна переглядати з двох різних каталогів одночасно (не моє виконання). Тому, якщо ми будемо використовувати url ('/ path') для одного, це порушить іншу посилання. Я маю використовувати відносний CSS, щоб він працював.
додано Автор Kendall Hopkins, джерело

Я вирішив, що я б переробив деякий код з Minify , щоб дозволити абстрактне перетворення css, яке я потребував.

<?php

//This class is heavy borrowed from Minify_ImportProcessor

class CSSImporter
{

    static function changePaths( $content, $current_path, $target_path )
    {
        $current_path = rtrim( $current_path, "/" );
        $target_path = rtrim( $target_path, "/" );
        $current_path_slugs = explode( "/", $current_path );
        $target_path_slugs = explode( "/", $target_path );
        $smallest_count = min( count( $current_path_slugs ), count( $target_path_slugs ) );
        for( $i = 0; $i < $smallest_count && $current_path_slugs[$i] === $target_path_slugs[$i]; $i++ );
        $change_prefix = implode( "/", array_merge( array_fill( 0, count( $target_path_slugs ) - $i, ".." ), array_slice( $current_path_slugs, $i ) ) );
        if( strlen( $change_prefix ) > 0 ) $change_prefix .= "/";

        $content = preg_replace_callback(
            '/
            @import\\s+
            (?:url\\(\\s*)?     # maybe url(
            [\'"]?              # maybe quote
            (.*?)               # 1 = URI
            [\'"]?              # maybe end quote
            (?:\\s*\\))?        # maybe )
            ([a-zA-Z,\\s]*)?    # 2 = media list
            ;                   # end token
            /x',
            function( $m ) use ( $change_prefix ) {
                $url = $change_prefix.$m[1];
                $url = str_replace('/./', '/', $url);
                do {
                    $url = preg_replace('@/(?!\\.\\.?)[^/]+/\\.\\[email protected]', '/', $url, 1, $changed);
                } while( $changed );
                return "@import url('$url'){$m[2]};";
            },
            $content
        );
        $content = preg_replace_callback(
            '/url\\(\\s*([^\\)\\s]+)\\s*\\)/',
            function( $m ) use ( $change_prefix ) {
               //$m[1] is either quoted or not
                $quote = ($m[1][0] === "'" || $m[1][0] === '"')
                    ? $m[1][0]
                    : '';
                $url = ($quote === '')
                    ? $m[1]
                    : substr($m[1], 1, strlen($m[1]) - 2);

                if( '/' !== $url[0] && strpos( $url, '//') === FALSE ) {
                    $url = $change_prefix.$url;
                    $url = str_replace('/./', '/', $url);
                    do {
                        $url = preg_replace('@/(?!\\.\\.?)[^/]+/\\.\\[email protected]', '/', $url, 1, $changed);
                    } while( $changed );
                }
                return "url({$quote}{$url}{$quote})";
            },
            $content
        );
        return $content;
    }

}

?>
2
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php