我需要将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 ...
请像我说的那样建议怎么做。 谢谢!
答案 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().
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}}单引号。