正規表現を書き換え
4月26日のエントリに書いたCSSの画像ファイルURI書き換え。
だいたいは大丈夫なんですが、一部CSSでは画像のURIがすでに http://images.example.com/で始まっているものがありました。
こんな感じ。
background-image:url(http://images.example.com/images/jp/bg-global.gif);
これを4月26日で書いた正規表現に食わせると、こういう出力が得られます。
background-image:url(http://images.example.com/http://images.example.com/images/jp/bg-global.gif);
そりゃそうだ。
ということでhttpが入っている場合を除くように書き換え。
こうなりました。
SetOutputFilter DEFLATE OutputSed "s/url([^(http)]\(['\"]*\)\/*\(.*\.[gj][pin]e*[fg]\)/url(\1http:\/\/images.example.com\/\2/g" AddoutputFilterByType Sed ; DEFLATE text/css
ところで
こんなテストデータを用意して試行錯誤しながらやっていました。
background-image:url(http://images.example.com/images/jp/bg-global.gif); background-image:url(/images/jp/bg-global.gif); background-image:url(images/jp/bg-global.gif); background-image:url("/images/jp/bg-global.gif");
これがこうなればOK。
background-image:url(http://images.example.com/images/jp/bg-global.gif); background-image:url(http://images.example.com/images/jp/bg-global.gif); background-image:url(http://images.example.com/images/jp/bg-global.gif); background-image:url("http://images.example.com/images/jp/bg-global.gif");
当初は4月26日のエントリで書いた先読みの否定でできるはずと思ってこう書いたのですが
OutputSed "s/url((?!http)\(['\"]*\)\/*\(.*\.[gj][pin]e*[fg]\)/url(\1http:\/\/images.example.com\/\2/g"
全然マッチしてくれない。
perlでは以下の表現でOKでした。
#!/usr/local/bin/perl while(<>){ s/url\((?!http:)(["']*)\/*(.*\.[gj][pin]e*[fg])/url\($1http:\/\/images.example.com\/$2/g ; print ; }
いろいろ文法的な制限があるみたい。