1

我只想从 Google Webfont Directory 的 URL 字符串中提取第一个字体名。以下是一些可能的字符串示例以及应返回的部分:

fonts.googleapis.com/css?family=Raleway              // "Raleway"
fonts.googleapis.com/css?family=Caesar+Dressing      // "Caesar Dressing"
fonts.googleapis.com/css?family=Raleway:300,400      // "Raleway"
fonts.googleapis.com/css?family=Raleway|Fondamento   // "Raleway"
fonts.googleapis.com/css?family=Caesar+Dressing|Raleway:300,400|Fondamento  // "Caesar Dressing"

所以有时它只是一个字体名,有时它有一个用冒号 ( :) 表示的权重,有时还有更多的字体名用竖线 ( |) 分隔。

我已经尝试过/family=(\S*)[:|]/,但它只匹配带有:or的字符串|。我可以这样做,但这不是一个好的解决方案:

var fontUrl = "fonts.googleapis.com/css?family=Caesar+Dressing|Raleway:300,400|Fondamento";
var fontName = /family=(\S*)/.exec(fontUrl)[1].replace(/\+/, " ");
if (fontName.indexOf(':') != -1){
    fontName = fontName.split(':')[0];
}
if (fontName.indexOf('|') != -1){
    fontName = fontName.split('|')[0];
}
console.log(fontName);

有一个很好的regex解决方案吗?

4

5 回答 5

3

而不是匹配(可能)跟随你想要的字符串的字符,只匹配你想要的字符串,除了那些字符

/family=([^\s:|]*)/

或者,您可以像这样使用前瞻

/family=(\S*?)(?=$|[:|])/
于 2013-04-23T15:25:34.507 回答
1

那应该更好:

/family=([^:|]*)/

当然,对于这种+情况,您必须在之后(或之前)更换它。

于 2013-04-23T15:25:22.280 回答
0

您可以使用(在所有情况下都选择 i 和 m 修饰符):

family=([a-z]+\+?[a-z]+)

或更简单地说

family=([a-z+]+)

或避免匹配 + 字符:

family=([a-z]+)\+?([a-z]+)?

但这是使用第二种解决方案的一种更简单的方法,并将 + 字符替换为后面的空格。

于 2013-04-23T15:29:50.253 回答
0

在这种情况下不需要正则表达式,除非您擅长正则表达式或彻底测试它们,否则您很可能会犯错误。

var fontUrls = [];

fontUrls.push("fonts.googleapis.com/css?family=Raleway");
fontUrls.push("fonts.googleapis.com/css?family=Caesar+Dressing");
fontUrls.push("fonts.googleapis.com/css?family=Raleway:300,400");
fontUrls.push("fonts.googleapis.com/css?family=Raleway|Fondamento");
fontUrls.push("fonts.googleapis.com/css?family=Caesar+Dressing|Raleway:300,400|Fondamento");

function getFirstFont(url) {
    return url.split("=")[1].split("|")[0].split(":")[0];
}

fontUrls.forEach(function (fontUrl) {
  console.log(getFirstFont(fontUrl));
});

jsfiddle上

于 2013-04-23T15:31:00.780 回答
0

尝试这个:

/family\=(\S+?)[\:\|,]{0,2}\S*/ims
于 2013-04-23T15:25:54.397 回答