2012-03-27 12 views
6

Hier ist meine regex Code:Regex: URLs in background-image CSS Finding, Ärger

preg_match_all('/background[-image]*:[\s]*url\(["|\']+(.*)["|\']+\)/', $css, $matches, PREG_SET_ORDER); 

Es CSS sieht das wie folgt aussieht:

background:url('../blah.jpg'); 

Mein Problem, das ich habe, ist, einige CSS ich kratzen sieht wie folgt aus:

background:transparent url('../blah.jpg'); 
background:transparent no-repeat url('../blah.jpg'); 

ich kein Experte bin, wenn es um regex kommt, so frage ich mich, wie ich es etwas überspringen kann sagen, nach dem Doppelpunkt und vor der URL.

Antwort

14

THS sollte Fange alle Bilder, wenn ich nichts auslasse.

preg_match_all('~\bbackground(-image)?\s*:(.*?)\(\s*(\'|")?(?<image>.*?)\3?\s*\)~i',$str,$matches); 
$images = $matches['image']; 
print_r($images); 
+0

BTW, '' fügt die passende Zeichenkette '$ matches ['image']' '? Das wusste ich nicht! Gute Eins !! – safrazik

+1

Ja. $ Übereinstimmungen fangen normalerweise alle Werte in Klammern und die gesamte Übereinstimmung ab. Sobald Sie jedoch wissen, wo genau Sie es erhalten möchten, unabhängig davon, wo es sich in Ihrer Regex befindet, können Sie Labels verwenden. Es ist viel praktischer. – inhan

+0

Danke für die Erklärung :) – safrazik

0

Try this:

preg_match_all('/background[-image]*:.*[\s]*url\(["|\']+(.*)["|\']+\)/', $css, $matches, PREG_SET_ORDER); 
+0

Wie überprüfen Sie, ob es keine doppelten oder einfachen Anführungszeichen hat? Kann nicht aufhören zu scheinen, wie man "nichts" weiterleitet lol als Optionen – Banning

1
preg_match_all('/background(-image)??\s*?:.*?url\(["|\']??(.+)["|\']??\)/', $css, $matches, PREG_SET_ORDER); 

I :[\s]* mit :.*? ersetzt, die den Trick tun sollte - bedeutet, dass es jedes Zeichen wird, die vorherige regex abgestimmt nur Leerzeichen nach :

+1

'[-image] *' bedeutet 'Null oder mehr der Zeichen [-aegim]'. '(-image)?' wäre besser. – Xeoncross

+0

Sie haben Recht! Ich habe diesen Teil nicht bemerkt – safrazik