2012-03-27 15 views
6

Ecco il mio codice regex:Regex: Trovare gli URL in background-image CSS, avendo difficoltà

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

Sembra per i CSS che assomiglia a questo:

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

Il mio problema che sto avendo è alcuni CSS mi raschiare si presenta così:

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

non sono un esperto quando si tratta di regex, quindi mi chiedo come posso dire che nulla di saltare dopo i due punti e prima dell'URL.

risposta

14

Ths dovrebbe cattura tutte le immagini a meno che non abbia saltato nulla.

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

BTW, '' aggiunge la stringa con corrispondenza a '$ corrisponde ['immagine']'? Non lo sapevo! Bene !! – safrazik

+1

Sì. Le corrispondenze $ normalmente catturano tutti i valori tra parentesi e l'intera corrispondenza, ma una volta che sai esattamente dove vuoi arrivare, indipendentemente da dove si trova nella tua espressione regolare, puoi usare le etichette. È molto più pratico. – inhan

+0

Grazie per la spiegazione :) – safrazik

0

Prova questo:

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

Come si controlla se non ha un preventivo doppio o singolo? Non posso smettere di sembrare come passare "niente" lol come opzioni – Banning

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

ho sostituito :[\s]* con :.*? che dovrebbe fare il trucco - significa che corrisponderà a qualsiasi carattere, la regex precedente pari solo spazi dopo :

+1

'[-image] *' significa 'Zero o più dei personaggi [-aegim] '. '(-immagine)?' sarebbe meglio. – Xeoncross

+0

hai ragione! Non ho notato che la parte – safrazik