2010-12-13 97 views
1

J'ai trouvé beaucoup de messages concernant l'extraction d'un nom de fichier d'un img-tag, mais aucun d'un tag de style CSS en ligne. Voici la chaîne sourceComment extraire le nom de fichier de l'image de la balise style/background-image?

<span style="width: 40px; height: 30px; background-image: url("./files/foo/bar.png");" class="bar">FOO</span> 

Ce que je veux est bar.png.

J'ai essayé ceci:

$pattern = "/background-image: ?.png/"; 
    preg_match($pattern, $string, $matches); 

Mais cela ne marchait pas sur.

Toute aide appréciée ..

+0

«/background-image: url \\ (([^ \\)] +) \\)/smi – henklein

+0

La même solution que [expression régulière en saisissant l'attribut href d'un élément A] (http://stackoverflow.com/questions/3820666/expression_expression_pour-gravailler-la-href-attribute-of-an-a-element). Utilisez DOM pour récupérer l'attribut de style, puis utilisez une expression régulière pour saisir la valeur de l'image d'arrière-plan – Gordon

Répondre

1
$string = '<span style="width: 40px; height: 30px; background-image: url("./files/foo/bar.png");" class="bar">FOO</span>'; 

$pattern = '/background-image:\s*url\(\s*([\'"]*)(?P<file>[^\1]+)\1\s*\)/i'; 
$matches = array(); 
if (preg_match($pattern, $string, $matches)) { 
    echo $matches['file']; 
} 
+0

super, cela a fait l'affaire pour moi. Je vous remercie! – cukabeka

2

Vous devez lire sur les expressions régulières.

"/background-image: ?.png/" 

signifie "background-image:" suivie éventuellement d'un espace, suivi d'un caractère unique, suivie (directement) par "jpeg".

Exactement ce que vous avez besoin dépend de la quantité de variation dont vous avez besoin pour permettre la mise en page de l'étiquette, mais il sera quelque chose comme

"/background-image\s*:\s*url\s*(\s*".*([^\/]+)"/ 

où tous les « \ s * » sont facultatifs espaces et parenthèses capture quelque chose qui ne contient pas une barre oblique.

Généralement, regexp n'est pas un bon outil pour analyser le HTML, mais dans ce cas limité, il pourrait être OK.

+0

Le ',' dans votre expression régulière doit être un '.' – Pit

+0

Corrigé. Je vous remercie. –

0

quelque chose le long des lignes

$style = "width: 40px; height: 30px; background-image: url('./files/foo/bar.png');"; 
preg_match("/url[\s]*\(([\'\"])([^\'\"]+)([\'\"])\)/", $style, $matches); 
var_dump($matches[2]); 

cela ne fonctionnera pas pour les noms de fichiers qui contiennent ' ou ". Il correspond essentiellement quelque chose entre la parenthèse de url() qui ne sont pas ' ou "