Php Regex 来替换 CSS 文件中的 url


Php Regex to replace urls in CSS file

>我正在将多个CSS文件压缩为一个,并将新生成的css文件移动到自己的文件夹。此举会弄乱图像、@import和字体路径。

有人可以看看这个,看看你是否可以设法修复以下路径。

$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);
好吧,

Dagon正在考虑,而OP只想按照要求去做,所以我理解这两点。如果OP知道他们想要什么并相信这是最好的解决方案,那么我会适应,尽管Dagon提出了有效的观点。

以下应该适合您,但可能无法解释所有扭曲。我会删除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');