Php Regex для замены URL в файле CSS

0

Я сжимаю несколько файлов CSS в одном и перемещая новый сгенерированный файл css в собственную папку. Этот ход испортит изображения, пути @import и fonts.

Может кто-то взглянуть на это и посмотреть, сможете ли вы исправить путь для следующего.

$content ='
    @import url(comments.css);<br />
    @import url(../comments.css);<br />
    @import url(../../comments.css);<br />
    background:url(http://example.com/test.jpg);<br />
    background:url("http://example.com/test.jpg");<br />
    background:url( "//example.com/test.jpg" );<br />
    background:url(//example.com/test.jpg);<br />
    background:url(test.jpg);<br />
    background:url(images/test.jpg);<br />
    background:url(../images/test.jpg);<br />
    background:url(../../images/test.jpg);<br />
    background:url(../../../images/test.jpg);<br />
    background:url(../../../images/test.jpg);<br />
  ';

$content .="
    background:url('http://example.com/test.jpg');<br />
    background:url('../images/test.jpg'  );<br />
";

$path = 'http://www.some.com/cached';
$re = "/url\\(\\s*[\\'\"]?\\/?(.+?)[\\'\"]?\\s*\\)/i"; 
$content = preg_replace($re, 'url('.$path.'/$1)', $content);

echo $content ;

Пример http://sandbox.onlinephpfunctions.com/code/20668872e49ea96b57964a9ee7176a5bbd796a5c

Желательным результатом будет

@import url(http://www.some.com/cached/comments.css);
@import url(http://www.some.com/cached/comments.css);
@import url(http://www.some.com/cached/comments.css);
background:url(http://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(http://www.some.com/cached/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://example.com/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);

Любая помощь приветствуется.

  • 0
    так как это одна работа, я бы сделал это вручную
  • 0
    @ Дагон, что заставляет вас думать, что это одна работа? Я сказал, что использую несколько файлов и не могу пройти через каждый, чтобы внести изменения для импорта, изображений или шрифтов.
Показать ещё 5 комментариев
Теги:
preg-replace

2 ответа

1
Лучший ответ

Это делает все, что вы хотели.

<?php
    // The content (heredoc syntax is cleaner when dealing with large strings)
    $content = <<<EOT
@import url(comments.css);<br />
@import url(../comments.css);<br />
@import url(../../comments.css);<br />
background:url(http://example.com/test.jpg);<br />
background:url("http://example.com/test.jpg");<br />
background:url( "//example.com/test.jpg" );<br />
background:url(//example.com/test.jpg);<br />
background:url(test.jpg);<br />
background:url(images/test.jpg);<br />
background:url(../images/test.jpg);<br />
background:url(../../images/test.jpg);<br />
background:url(../../../images/test.jpg);<br />
background:url(../../../images/test.jpg);<br />'
background:url('http://example.com/test.jpg');<br />
background:url('../images/test.jpg'  );<br />
EOT;

    // Set path
    $path = 'http://www.some.com/cached/';

    // Clear out the line breaks
    $content = str_replace('<br />', '', $content);

    // Clear out bogus whitespace
    $content = preg_replace('/\(\s+/', '(', $content);
    $content = preg_replace('/\s+\)/', ')', $content);

    // Clear out quotes
    $content = preg_replace('/(?:\'|\")/', '', $content);

    // Replaces repeating ../ patterns
    $content = preg_replace('/(?:\.\.\/)+(.*?\))/', $path.'$1', $content);

    // Prepend the path to lines that do not have a "//" anywhere
    $content = preg_replace('/(url\((?!.*\/\/))/i', '$1'.$path, $content);

    echo $content;

Я исправил эти 2 строки от желаемого результата:

background:url(/http://example.com/test.jpg);
background:url(/http://example.com/test.jpg);
  • 0
    спасибо за построчное объяснение. делает гораздо больше, чем я просил.
  • 0
    Ваш код потрясающий, хотя одна проблема. У меня есть несколько других CSS с этим, и он берет цитаты из всех других свойств CSS. Есть ли вообще цитаты только из URL?
2

Ну Дагон думает впереди, а ОП просто хочет сделать то, что было задано, поэтому я понимаю обе точки. Если OP знает, чего они хотят, и считаю, что это лучшее решение, я приспособился, хотя Дагон делает правильные баллы.

Нижеследующее должно работать для вас, но не может учитывать все искажения. Я бы удалил строки example.com чтобы упростить обработку и не учитывать каждую возможность с одним регулярным выражением, но это я:

$content ='
    @import url(comments.css);<br />
    @import url(../comments.css);<br />
    @import url(../../comments.css);<br />
    background:url(http://example.com/test.jpg);<br />
    background:url("http://example.com/test.jpg");<br />
    background:url( "//example.com/test.jpg" );<br />
    background:url(//example.com/test.jpg);<br />
    background:url(test.jpg);<br />
    background:url(images/test.jpg);<br />
    background:url(../images/test.jpg);<br />
    background:url(../../images/test.jpg);<br />
    background:url(../../../images/test.jpg);<br />
    background:url(../../../images/test.jpg);<br />
  ';

$content .="
    background:url('http://example.com/test.jpg');<br />
    background:url('../images/test.jpg'  );<br />
";

// contains example.com stuff
$matches1 = preg_replace($r1, '', $content);
// contains everything that does not contain example.com
$matches2 = preg_replace($r2, '', $content);

// replace relative paths
$output = preg_replace('~\((?:[./\s\'"]+|)~', '(http://www.some.com/cached/', $matches2);
// replace example.com stuff
$output .= preg_replace('~(?<!http:)//~', 'http://', $matches1);

print_r($output,false);

Выводит следующие

@import url(http://www.some.com/cached/comments.css);
@import url(http://www.some.com/cached/comments.css);
@import url(http://www.some.com/cached/comments.css);
background:url(http://www.some.com/cached/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg);
background:url(http://www.some.com/cached/images/test.jpg' );
background:url(http://example.com/test.jpg);
background:url("http://example.com/test.jpg");
background:url( "http://example.com/test.jpg" );
background:url(http://example.com/test.jpg);
background:url('http://example.com/test.jpg');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню