2012-03-27 8 views
6

Aquí está mi código expresiones regulares:Regex: Encontrar las direcciones URL en Imagen de fondo CSS, tiene problemas para

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

Se busca CSS que tiene este aspecto:

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

Mi problema que estoy teniendo es un poco de CSS que raspadura se ve así:

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

no soy un experto cuando se trata de expresiones regulares, por lo que me pregunto cómo puedo decirle que se omita nada después de los dos puntos y antes de la URL.

Respuesta

14

THS debe atrapa todas las imágenes a menos que omita cualquier cosa.

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

BTW, '' agrega la cadena coincidente a '$ matches ['image']'? ¡No lo sabía! ¡Bien! – safrazik

+1

Sí. $ matches normalmente captura todos los valores entre paréntesis y la coincidencia completa, pero una vez que sepa exactamente dónde desea obtener, independientemente de dónde se encuentre en su expresión regular, puede usar etiquetas. Es mucho más práctico. – inhan

+0

Gracias por la explicación :) – safrazik

0

Prueba esto:

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

¿Cómo se comprueba si no tiene comillas dobles o simples? No se puede dejar de parecer cómo pasar "nada" jajaja como opciones – Banning

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

Substituí :[\s]* con :.*? que debe hacer el truco - significa que coincidirá con cualquier carácter, la expresión regular anterior sólo comparable espacios después :

+1

'[-image] *' significa 'cero o más de los caracteres [-aegim]'. '(-image)?' sería mejor. – Xeoncross

+0

¡tienes razón! No noté que la parte – safrazik

Cuestiones relacionadas