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 { .. } 某处

您可以使用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 回答