Заменить CSS url ()? - PullRequest
       3

Заменить CSS url ()?

1 голос
/ 03 апреля 2012

Представьте, что у меня есть строка $my_css_string, и мы знаем, что она содержит стили CSS.

Теперь представьте, что у меня есть функция string url_replace(string $url), которая возвращает измененный URL-адрес, который я хочу заменять каждые url() на $my_css_string.

Итак, ради простоты, скажем, url_replace() ВСЕГДА возвращает строку "xxxx".

Как пройти через $my_css_string, найти каждый url() в строке и заменить этот URL-адрес на то, что вы получаете от url_replace()?


Итак, если у вас был этот CSS как $my_css_string:

@import url('http://example.com/css/animals.css');
.dog {
    background:url("/images/dog.png");
    border:1px solid rgb(0,0,128);
}
.cat {
    background:url(http://example.com/images/cat.gif);
}

Если вы запустите код, $my_css_string станет:

@import url('xxxx');
.dog {
    background:url( "xxxx" );
    border:1px solid rgb(0,0,128);
}
.cat {
    background:url(xxxx);
}

Обратите внимание, как нужно обрабатывать несколько способов определения URL.

Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Вы хотите использовать preg_replace_callback:

$my_new_css_string = preg_replace_callback(
                        '/background-image:\s*url\(\s*([\'"]*)(?P<file>[^\1]+)\1\s*\)/i',
                        'url_replace',
                        $my_css_string);
0 голосов
/ 03 апреля 2012

Если вы не придирчивы, вы можете использовать следующее выражение для соответствия url() s:

/\b url\( \s*+ \K  (?| (") ( (?>[^"\\]++|\\.)*+ ) " | (') ( (?>[^'\\]++|\\.)*+ ) ' | () ([\S)]*+) )  ( \s*+ \) )/ix

Это выражение будет правильно обрабатывать экранирование, но также может совпадать в комментариях и строках, что может быть нежелательно.

И затем вы можете использовать его с preg_replace_callback или просто с /e, например:

preg_replace('/\b url\( \s*+ \K  (?| (") ( (?>[^"\\\\]++|\\\\.)*+ ) " | (\') ( (?>[^\'\\\\]++|\\\\.)*+ ) \' | () ([\S)]*+) )  ( \s*+ \) )/ixe', '"$1" . url_replace("$2") . "$1$3"', $css);
0 голосов
/ 03 апреля 2012

Вы смотрели на это: http://us3.php.net/manual/en/function.preg-replace-callback.php. Вы должны быть в состоянии найти 'url (. *)' И затем реализовать собственную логику в обратном вызове для обработки различных сценариев замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...