Я сжимаю несколько файлов 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);
Любая помощь приветствуется.
Это делает все, что вы хотели.
<?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);
Ну Дагон думает впереди, а ОП просто хочет сделать то, что было задано, поэтому я понимаю обе точки. Если 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');