PHP — извлечение путей к изображениям из css

#php #regex

#php #регулярное выражение

Вопрос:

У меня есть таблица стилей, подобная этой:

 .d2 {
    position:absolute;
    background:url(../img/delete.png) no-repeat 0px 1px;
    color:#0066CC;
}
.reply {
    position:absolute;
    background:url(../img/pen.png) no-repeat 0px 1px;
    top:5px
}
#about {
    position:absolute;
    background:url(../img/abc.png);
    top:5px
}
  

Я хочу получить пути к изображениям, которые не имеют атрибута no-repeat. Ожидаемый результат в виде fowllow:

 array('../img/pen.png', '../img/delete.png')
  

Ответ №1:

Этот протестированный код сделает это:

 $imgs = array();
$re = '/url(s*['"]?(S*.(?:jpe?g|gif|png))['"]?s*)[^;}]*?no-repeat/i';
if (preg_match_all($re, $text, $matches)) {
    $imgs = $matches[1];
}
  

Ответ №2:

Я бы прочитал файл построчно.

 <?php

$image = [];
$lines = file('http://www.example.com/');

// Loop through our array, show HTML source as HTML source; and line numbers too.
foreach ($lines as $line_num => $line) {
    if (strpos($line, 'no-repeat') {
        if (strpos($line, '.png')) {
            $urlpos = strpos($line, 'url');
            $rightone = strpos($line, '(', $urlpos);
            $leftone = strpos($line, ')', $rightone);

            array_push($images, substr($line, $rightone, $leftone - $rightone));
        }
    }
}
  

Ответ №3:

Если вы ищете только фон (и они следуют этому порядку параметров (url, repeat, rest)):

 preg_match_all('~background:s*url(['"]?([^)] )['"]?)s no-repeat[^;]*;~i', $css, $reg);

print_r($reg[1]);
  

вывод:

 Array
(
    [0] => ../img/delete.png
    [1] => ../img/pen.png
)