0

$plain_css変数にいくつかの CSS があるとします。

.slide-pause {
  cursor: url(http://example.com/img/bg/pause.png),url(http://example.com/img/bg/pause.png),auto;
}
.something {
  background-image: url('http://example.com/img/bg/beautiful.png'); // We have Quotes here
}

この CSS からすべての URL を取得する必要があります。

これは私がこれを達成しようとしている方法です:

preg_match_all('!url\(\'?http://example.com/.*\)!', $plain_css, $matches);

$matches返されるもの:

array
  0 => 
  array
    0 => string 'url(http://example.com/img/bg/pause.png),url(http://localhost/site/img/bg/pause.png)'
    1 => string 'url(http://example.com/img/bg/beautiful.png)'

返す必要があるもの:

array
  0 => string 'url(http://example.com/img/bg/pause.png)'
  1 => string 'url(http://example.com/img/bg/pause.png)'
  2 => string 'url(http://example.com/img/bg/beautiful.png)'
4

2 に答える 2

3

あなたは貪欲の犠牲者です。.*可能な限り一致します。.*?迅速な修正のために貪欲にならないようにするには、に置き換えます。または、繰り返し文字を禁止)します (通常はこれが好まれます - より明示的で効率的です):

preg_match_all('!url\(\'?http://example.com/[^)]*)!', $plain_css, $matches);

すべてを単純な配列で返すように説得することはできないことに注意してくださいpreg_match_all-常にネストされた配列を取得します(これは をキャプチャするために重要です)。しかし、 から目的の結果を簡単に得ることができます$matches[0]

于 2013-08-28T18:54:11.683 に答える
2

反復量指定子を遅延させる必要があります (デフォルトは貪欲です)。

preg_match_all('!url\(\'?http://example.com/.*?\)!', $plain_css, $matches);

*ここでの唯一の変更点は、反復量指定子の後に疑問符を追加したことです。通常、繰り返しは貪欲です: つまり、可能な限り多くの文字に一致します (それでも式を満たします)。この場合、量指定子の貪欲さが入力文字列の*両方の式を消費していました。url遅延量指定子に変更すると、問題が解決します。

.これを処理するもう 1 つの方法は、メタ文字 (改行以外の任意の文字に一致する)の代わりに否定文字クラスを使用することです。

preg_match_all('!url\(\'?http://example.com/[^)]*\)!', $plain_css, $matches);
于 2013-08-28T18:53:26.243 に答える