2012-03-27 18 views
6

Oto mój kod regex:Regex: Znalezienie URL w tle obrazu CSS, kłopoty

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

Wygląda na CSS, który wygląda tak:

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

Mój problem mam jest I zeskrobać trochę CSS wygląda następująco:

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

nie jestem ekspertem, jeśli chodzi o wyrażenie regularne, więc zastanawiam się, jak mogę powiedzieć to, aby pominąć niczego po dwukropku i przed URL.

Odpowiedz

14

Ths powinien łapie wszystkie obrazy, chyba że coś pominąłem.

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

BTW, '' dodaje dopasowany ciąg do '$ matches ['image']'? Nie wiedziałem tego! Dobry!! – safrazik

+1

Tak. Mecze $ normalnie przechwytują wszystkie wartości w nawiasach i cały mecz, ale gdy już wiesz, gdzie dokładnie chcesz się dostać, niezależnie od tego, gdzie jest w twoim regexie, możesz użyć etykiet. Jest o wiele bardziej praktyczny. – inhan

+0

Dziękuję za wyjaśnienie :) – safrazik

0

Spróbuj tego:

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

Jak sprawdzić, czy nie ma podwójnego ani pojedynczego cudzysłowu? Nie mogę wyjść, wydaje mi się, jak przekazać "nic" lol jako opcję – Banning

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

Wymieniłem :[\s]* z :.*? które powinno załatwić sprawę - oznacza, że ​​będzie on pasował do dowolnego znaku, poprzedni regex dopasowany tylko spacje po :

+1

'[-image] *" oznacza "zero lub więcej znaków [-aegim]". '(-image)?' byłoby lepsze. – Xeoncross

+0

masz rację! Nie zauważyłem, że część – safrazik