url()
CSS ファイルからすべての URL (式) を取得する必要があります。例えば:
b { background: url(img0) }
b { background: url("img1") }
b { background: url('img2') }
b { background: url( img3 ) }
b { background: url( "img4" ) }
b { background: url( 'img5' ) }
b { background: url (img6) }
b { background: url ("img7") }
b { background: url ('img8') }
{ background: url('noimg0) }
{ background: url(noimg1') }
/*b { background: url(noimg2) }*/
b { color: url(noimg3) }
b { content: 'url(noimg4)' }
@media screen and (max-width: 1280px) { b { background: url(img9) } }
b { background: url(img10) }
img*
URL ではなく、すべての URL を取得する必要がありnoimg*
ます (無効な構文、無効なプロパティ、またはコメント内)。
古き良き正規表現を使ってみました。いくつかの試行錯誤の後、私はこれを得ました:
private static IEnumerable<string> ParseUrlsRegex (string source)
{
var reUrls = new Regex(@"(?nx)
url \s* \( \s*
(
(?! ['""] )
(?<Url> [^\)]+ )
(?<! ['""] )
|
(?<Quote> ['""] )
(?<Url> .+? )
\k<Quote>
)
\s* \)");
return reUrls.Matches(source)
.Cast<Match>()
.Select(match => match.Groups["Url"].Value);
}
これはクレイジーな正規表現の 1 つですが、それでも機能しません。3 つの無効な URL (つまり、2、3、4) に一致します。さらに、誰もが複雑な文法の解析に正規表現を使用するのは間違っていると言うでしょう。
別のアプローチを試してみましょう。この質問によると、実行可能な唯一のオプションはExCSS です(他のオプションは単純すぎるか、時代遅れです)。ExCSSを使用すると、次のようになりました。
private static IEnumerable<string> ParseUrlsExCss (string source)
{
var parser = new StylesheetParser();
parser.Parse(source);
return parser.Stylesheet.RuleSets
.SelectMany(i => i.Declarations)
.SelectMany(i => i.Expression.Terms)
.Where(i => i.Type == TermType.Url)
.Select(i => i.Value);
}
正規表現ソリューションとは異なり、これは無効な URL をリストしません。しかし、いくつかの有効なものがリストされていません! つまり、9 と 10 です。これは一部の CSS 構文の既知の問題であり、ライブラリ全体を最初から書き直さない限り修正できないようです。ANTLRの書き換えは放棄されたようです。
質問: CSS ファイルからすべての URL を抽出する方法を教えてください。(上記の例として提供されているものだけでなく、CSS ファイルを解析する必要があります。「noimg」をチェックしたり、1 行の宣言を想定したりしないでください。)
NBこれは「ツールの推奨事項」の質問ではありません。コードの一部、上記のソリューションの1つに対する修正、ライブラリなど、どのソリューションでも問題ありません。必要な機能を明確に定義しました。