正規表現を書き換え

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 ;
}

いろいろ文法的な制限があるみたい。

5月8日追記

この正規表現間違っています。'url('に続く任意の一文字の表現になってる。修正中。くそー、mod_sedだから先読みの否定が使えないのか。