Как извлечь имя файла изображения из тега style/background-image?

Я нашел много постов, касающихся извлечения имени файла из тега img, но ни одного из тега в стиле CSS. Вот исходная строка

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

То, что я хочу получить, это bar.png.

Я попробовал это:

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

Но это не сработало.

Любая помощь приветствуется..

3 ответа

Решение
$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'];
}

Вы должны прочитать о регулярных выражениях.

"/background-image: ?.png/"

означает "background-image:", за которым необязательно следует пробел, за которым следует любой отдельный символ, за которым (непосредственно) следует "png".

Точно то, что вам нужно, зависит от того, сколько вариаций нужно учесть в макете тега, но это будет что- то вроде

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

где все "\s*" являются необязательными пробелами, а круглые скобки фиксируют то, что не содержит косой черты.

Как правило, регулярное выражение не является хорошим инструментом для анализа HTML, но в этом ограниченном случае все может быть в порядке.

Что -то вроде

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

это не будет работать для имен файлов, которые содержат ' или же ", Это в основном соответствует что-либо между круглыми скобками url() это не ' или же "

Другие вопросы по тегам