2017-07-27 3 views
-1

Ich versuche, den Inhalt einer CSS-Datei zu lesen und nach allen Links zu externen Dateien zu suchen. Ich dachte, dass es schneller wäre, einen schnellen regulären Ausdruck zu schreiben, um es für mich zu tun, aber das erweist sich als frustrierend.JavaScript - Regex - Greifen Sie nur auf übereinstimmendes Muster, wenn mehrere Übereinstimmungen in einer einzelnen Zeile sind

Sagen, ich habe:

@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') 

Diese Linie für etwas weitergeht, lässt aber nehmen nur, dass jetzt.

Wie Sie sehen können, gibt es sowohl src:url(...) und url(...) so dachte ich, ich nur für url(..) Vorkommen aussehen könnte.

Hier ist, was ich versucht: 1 Nehmen:

var contents.match = ... // The contents of the .min.css file. 
var matches = contents.match(/url\s*(.*);/g); 

Take 2:

var contents.match = ... // The contents of the .min.css file. 
var matches = contents.match(/url\s*(.*);/); //no g at the end. 

3 Nehmen:

var contents.match = ... // The contents of the .min.css file. 
var matches = contents.match(/url\s*\((.*)\);/g); 

4 Nehmen:

var contents.match = ... // The contents of the .min.css file. 
var matches = contents.match(/url\s*\((.*)\);/); // no g at the end. 

Alles, was ich will, ist ein Array aller Übereinstimmungen, entweder nur die Zeichenfolge zwischen() oder die ganze Übereinstimmung, d.h. URL (...); Stattdessen bekomme ich nur eine massive Pipe aus der gesamten Datei.

Was ich will:

console.log(matches); /// Prints ['fonts/font_1.css', 'fonts/font_2.css', 'fonts/font_3.css'] 

von

console.log(matches); /// Prints ["url(fonts/font_1.css')", "url('fonts/font_2.css')", "url('fonts/font_3.css')"] 

Wo ich etwas fehle?

+1

'*' 'wird übereinstimmen;' was bedeutet, dass das Spiel bis zur letzten verlängern ';' es findet.. Probiere '[^;] +' anstelle von '. *'. – Titus

+0

hinweis: seiten wie [regex101] (https://regex101.com/) sind sehr nützlich beim testen von regulären ausdrücken (denken sie daran, den geschmack entsprechend einzustellen) –

+0

Probieren Sie '/url\((.*?)\)/g ' –

Antwort

1

Die .* ist ein Problem, weil es auch zu schließenden Parens passt.

versuchen Sie dies: /url\s*\([^)]*\)/g

0

Es sieht so aus, als ob Sie vermisst werden? in deinem Ausdruck. Statt dessen: contents.match(/url\s*\(.*\);/g); so etwas wie dieses Versuchen: contents.match(/url\s*\(.*?\);/g);

Was Sie gerade passende aus der ersten Instanz von URL ist (zur letzten Instanz).

Verwandte Themen