0

我正在处理 CSS 文件,并且正在尝试使用 PHP 遍历 CSS 文件。我正在寻找的是使用正则表达式(您知道的任何更快的方法?)在 url() 选择器中捕获任何图像路径。

到目前为止,我能够找到这个表达式: url(([^)]+))
但那个不是我正在寻找的 100%。我需要一个表达式来找到 url 选择器并捕获其中的任何内容,这意味着如果代码包含引号或单引号,它们将不会被捕获。eg: url("images/sunflower.png") 捕获的字符串只能是:images/sunflower.png

感谢帮助。

4

3 回答 3

2

请不要重新发明轮子,您可以避免...

有大量的 CSS 解析器可以在 Internet 上免费获得。如果您想知道它是如何完成的,请打开其中一个开源软件,看看它是如何完成的。这是一个需要 2 分钟才能找到的示例:

https://github.com/sabberworm/PHP-CSS-Parser#value

我已经向您指出了实际显示如何提取 URL 的部分。

于 2013-06-15T12:53:30.763 回答
1

试试这个尺寸。它不适用于以开头的字符串,url(但如果您正在解析实际的 CSS,那么在没有选择器或属性的情况下开始是无效的。

$data =' #foo { background: url("hello.jpg"); } #bar { background: url("flowers/iris.png"); }';
$output = array();
foreach(explode("url(", $data) as $i => $a) { // Split string into array of substrings at boundaries of "url(" and loop through it
    if ($i) {
        $a = explode(")", $a); // Split substring into array at boundaries of ")"
        $url = trim(str_replace(array('"',"'"), "", $a[0])); // Remove " and ' characters
        array_push($output, $url);
    }
} 
print_r($output);

输出:

Array ( [0] => hello.jpg [1] => flowers/iris.png )
于 2013-06-15T13:24:04.303 回答
0

虽然我同意 bPratik 的回答,但您可能只需要:

preg_match('/url\([\'"]?([^)]+?)[\'"]?\)/', 'url("images/sunflower.png")', $matches);

/**
url\( matches the url and open bracket
[\'"]+? matches a quote if there is one
([^]+?) matches the contents non-greedy (so the next closing quote wont get stolen)
[\'"]? matches the last quote
) matches the end.
*/

var_dump($matches);
array(2) {
  [0]=>
  string(27) "url("images/sunflower.png")"
  [1]=>
  string(20) "images/sunflower.png"
}
于 2013-06-15T13:27:06.077 回答