0

セレクターが@font-faceで始まっている場合にのみフォントファミリーを取得しようとしていますが、セレクターが@ font-faceで始まっていない場合は壊れますが、以下は機能しないようです。

CSSファイルの内容:

@font-face {
  font-family: 'someFonts'; 
}

@font-face {
  font-family: 'someotherFonts';    
}

.style {
  font-family: 'someFonts';
}

PHP:

$content = file_get_contents($file->uri);
if (!preg_match('#@font-face {([^;]+);#i', $content, $matches)) {
  break;
}

$fonts = array();
if (preg_match_all('#font-family:([^;]+);#i', $content, $matches)) {
  foreach ($matches[1] as $match) {
    if (preg_match('#"([^"]+)"#i', $match, $font_match)) {
      $fonts[] = $font_match[1];
    }
    elseif (preg_match("#'([^']+)'#i", $match, $font_match)) {
      $fonts[] = $font_match[1];
    }
  }
}

ヒントは大歓迎です。ありがとう

4

3 に答える 3

1

動作していませんか?次のコードで問題ありません-

$content = "@font-face {
  font-family: 'someotherFonts';    
}

.style {
  font-family: 'someFonts';
}";

if (!preg_match('#@font-face {([^;]+);#i', $content, $matches)) {
  echo "didnt find match";
}
else{
    print_r($matches);
}

上記のコードはあなたのために働きますか?

考えられる問題は1です。ファイルから正しく読み取れません。$contentをエコーし​​てみてください。2.動作し、確認中に見落としがありました。elseブロックで$matchesをエコーし​​てみてください。

于 2012-04-20T14:31:04.850 に答える
1

あなたはどのように機能するかについて誤解していると思いますpreg_match()if()実際にはファイルの@font-face { .. } どこかにあるため、条件は常にtrueと評価されます。

次のように、セレクターpreg_match_all()内で定義されているすべてのフォントファミリを検索するために使用できます。@font-face

$fonts = array();
$content = file_get_contents($file->uri);

if( preg_match_all('=@font-face\s*{.*font-family: (.*)[\s|;].*}=isU', 
       $content, 
       $matches) ) {
    $fonts = array_merge($fonts, $matches[1]);
}

print_r($fonts);

結果:

Array ( 
       [0] => 'someFonts' 
       [1] => 'someotherFonts' 
) // the second "someFonts" from your class ".style" is not included in the list!
于 2012-04-20T14:33:52.897 に答える
0

正規表現で試すことができます:

#@font-face\s*\{\s*(([^:]+)\s*:\s*([^;]+);\s*)+?\s*}#i

@font-face任意の宣言(単一または複数行)に一致します

于 2012-04-20T14:44:14.217 に答える