PHP替换css文件中的部分URL

时间:2015-03-16 17:54:21

标签: php regex

我需要将css文件中的相对url替换为我的服务器静态URL。

例如,我有一个CSS规则:

[/ public / images ...]或['/ public / images ...'],或[../ public / images ...]或['../ public / images ...' ]我需要将所有这些网址替换为我的静态服务器CDN:

/public/images... -> //static.mysite.com/public/images...
'/public/images...' -> '//static.mysite.com/public/images...'
../public/images... -> //static.mysite.com/public/images...

我写了一个正则表达式来执行此操作,但它不适用于URL开头的“../”。这是:

$fileRawContent = file_get_contents($filePath);
$replacedContent = preg_replace('/\(\'?(.*(\.\.)?\/public\/images.*)\'?\)/', "($staticServer$1)", $fileRawContent);

这仅适用于/ public / images,但不适用于../ public / images ...

请像我说的那样建议怎么做。 谢谢!

3 个答案:

答案 0 :(得分:0)

为什么不使用str_replace?

$replaced_content = str_replace(
array('[/public_images/1/', '[/public_images/2/', '[/public_images/3/'),
array('[//static.mysite.com/public/images/1/', '[//static.mysite.com/public/images/2/', '[//static.mysite.com/public/images/3/'), $file_raw_content);

答案 1 :(得分:0)

正则表达式可能非常密集。您可以使用更简单的方法执行此操作,例如strpos().

http://php.net/strpos

if (strpos($filepath, 'public/images') !== FALSE) 
{
    $filepath = '//static.mysite.com/public/images...';
}

也许将它与@juge答案结合起来,这样你就不会总是在寻找三种变体。

答案 2 :(得分:0)

此PHP preg_replace执行您所描述的内容:

preg_replace(
    "/(')?(\.\.)?(\/public\/images.*'?)/"
    , "$1$staticServer$3" // notice the $1 at the start, $3 at the end
    , $fileRawContent
);

试运行:

$staticServer = '//static.mysite.com';
$fileRawContent = "'../public/images...'";
$replacedContent = preg_replace("/(')?(\.\.)?(\/public\/images.*'?)/", "$1$staticServer$3", $fileRawContent);
print $replacedContent;

输出:

'//static.mysite.com/public/images...'

同样地:

/public/images...   -> //static.mysite.com/public/images...
'/public/images...' -> '//static.mysite.com/public/images...'
../public/images... -> //static.mysite.com/public/images...

正则表达式说明:

(')?(\.\.)?(\/public\/images.*'?)

我们从括号中的单引号开始。这允许我们1)使用问号?使其可选,并且2)捕获它以插入我们的替换参数。然后我们在括号中包含两个句点.,并使它们成为可选?。 (这些也被捕获到变量$2中,但我们不会使用它。)最后,我们捕获(正确转义的)公共图像路径,后跟零个或多个字符.*和一个可选的{ {1}}单引号。