2015-04-22 83 views
2

我一直在尝试获取我在wordpress主题enqeueing的字体数组。这只是为了测试。正确的正则表达式来检测从谷歌字体链接src的字体家族名称

对于输入:

http://fonts.googleapis.com/css?family=Arimo:400,700|Quicksand:400,700|Cantarell:400,700,400italic,700italic|Muli:300,400,300italic,400italic|Roboto+Slab:400,700|Share:400,700,400italic,700italic|Inconsolata:400,700|Karla:400,700,400italic,700italic|Maven+Pro:400,500,700,900|Roboto+Slab:400,700|Open+Sans:400italic,600italic,700italic,400,600,700 

我需要的输出是这样的:

array(
[0] => 'Arimo', 
[1] => 'Quicksand', 
[2] => 'Cantarell', 
... so on 
) 

到目前为止,我已经做了几乎所有的东西,但一个小问题。

我的代码:

$input = 'http://fonts.googleapis.com/css?family=Arimo:400,700|Quicksand:400,700|Cantarell:400,700,400italic,700italic|Muli:300,400,300italic,400italic|Roboto+Slab:400,700|Share:400,700,400italic,700italic|Inconsolata:400,700|Karla:400,700,400italic,700italic|Maven+Pro:400,500,700,900|Roboto+Slab:400,700|Open+Sans:400italic,600italic,700italic,400,600,700'; 

$against = "/[A-Z][a-z]+[\+][A-Z][a-z]+|[A-Z][a-z]+/"; 

$matches = array() 

preg_match_all($against, $input, $matches); 

print_r($matches); 

由此看来,输出是这样的:

array(
0 => Arimo 
1 => Quicksand 
2 => Cantarell 
3 => Muli 
4 => Roboto+Slab 
5 => Share 
6 => Inconsolata 
7 => Karla 
8 => Maven+Pro 
9 => Roboto+Slab 
10 => Open+Sans 
) 

还有的+标志,其中的字体名称中有空格。我想摆脱这一点。

我不是正则表达式专家。所以,无法做到这一点。

注:我知道我可以用str_replace()做到这一点,但不想经历这么长的过程。我想知道是否有可能通过+登录,并在收集匹配的表达式时留下空白处。

+0

在我的愚见,你会在一刻或其他需要使用**替换**函数,因为你只调用一个匹配函数。您可以在preg_match之前调用它,或者在数组的每个元素的preg_match之后调用它。由于preg_replace()以一般方式比str_replace()花费更多,所以您可能需要使用它。 –

+0

我希望能通过搜索。也许在正则表达式中,我们搜索一个+符号,而是写一个空白空间。可能吗? –

+0

'str_replace()'不是一个漫长的过程。 –

回答

0

在url中编码为加号(+)的空格。你应该解码你的网址。

$input = urldecode($input); 
+0

是的,做了这份工作!在使用urldecode之后,将正则表达式改为“/ [A-Z] [a-z] + [\ s] [A-Z] [a-z] + | [A-Z] [a-z] + /”,现在它正在工作。但仍想通过正则表达式来了解它是否可能。如果可能的话,我可以在这里学到新东西。 欢呼! –

0

一般来说,你有超过+个字符担心。

必须使用percent-encoding%xx)转义特殊字符,例如和号(&)和URL查询参数中的非ASCII字符。另外,当提交HTML表单时,空格使用+字符进行编码。

例如:

  • 的字体族 “雅克&吉尔” 将被转义为:

    Jacques+%26+Gilles

  • Unicode字符U+1E99 (LATIN SMALL LETTER Y WITH RING ABOVE),序列化到八位字节为UTF-8( E1BA99),将被转义为:

    %e1%ba%99


做你想做正确什么,你必须提取从URL查询字符串,并使用parse_str()提取name=value双。 parse_str()函数会自动将urldecode()的名称和值包括+个字符。

首先,拆分URL上?字符提取查询字符串:

$url = 'http://fonts.googleapis.com/css?family=Arimo:400,700|...|Maven+Pro:400,500,700,900|Roboto+Slab:400,700|...'; 

$a = explode ('?', $url, 2); 
if (isset ($a[1])) { 
    $query = $a[1]; 
} 

您还可以使用parse_url ($url, PHP_URL_QUERY),但它不会给你买多少在这种情况下。

然后将解压后的所有参数:

if (isset ($query)) { 
    parse_str ($query, $params); 

    if (isset ($params['family'])) { 
    /* OK: Extract family names. */ 
    } else { 
    /* Error: No family parameter found. */ 
    } 
} else { 
    /* Error: No query string found. */ 
} 

注:你应该总是指定parse_str()第二个参数,以避免现有重挫变量。

0

没有正则表达式:

$query = strtr(substr(parse_url($url, PHP_URL_QUERY),7), '+', ' '); 

$result = array_map(function ($i) { return explode(':', $i)[0]; }, explode('|', $query)); 

用正则表达式:

if (preg_match_all('~(?:\G(?!\A)|[^?&]+[?&]family=)([^:|&]+):[^:|&]*(?:[|&#]|\z)~', strtr($url, '+', ' '), $m)) 
    $result2 = $m[1]; 
0

从您的代码,输出给了我这样的事情。

array([0] => array([0] => Arimo[1] => Quicksand[2] => Cantarell[3] => Muli[4] => Roboto+Slab[5] => Share[6] => Inconsolata[7] => Karla[8] => Maven+Pro[9] => Roboto+Slab[10] => Open+Sans)) 

如果是正确的,那么我解决了这个问题'+'。这里是解决方案。

$input = 'http://fonts.googleapis.com/css?family=Arimo:400,700|Quicksand:400,700|Cantarell:400,700,400italic,700italic|Muli:300,400,300italic,400italic|Roboto+Slab:400,700|Share:400,700,400italic,700italic|Inconsolata:400,700|Karla:400,700,400italic,700italic|Maven+Pro:400,500,700,900|Roboto+Slab:400,700|Open+Sans:400italic,600italic,700italic,400,600,700'; 

$against = "/[A-Z][a-z]+[\+][A-Z][a-z]+|[A-Z][a-z]+/"; 

$matches = array(); 
$newArr=array(); 
preg_match_all($against, $input, $matches); 

for($i=0;$i< count($matches);$i++){ 
    for($j=0;$j< count($matches[$i]);$j++){ 
     $string=preg_replace('/[^A-Za-z0-9\-]/', ' ', $matches[$j]); 
     if($string!=""){ 
      $newArr[]=$string; 
     } 
    }  
} 
print_r($newArr); 
相关问题