regex 更正正则表达式以检测来自google字体链接源的字体系列名称

oewdyzsn  于 2022-11-26  发布在  Go
关注(0)|答案(4)|浏览(121)

我一直试图得到我的WordPress主题的字体,我enqueing数组。这只是测试。
输入时:

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
)

字体名称有空格的地方有个+符号,我想去掉它。
我不是正则表达式Maven。所以,我没办法做到。

注意:我知道我可以用str_replace()来做,但是我不想经历那么长的过程。我想知道当我们收集匹配的表达式时,是否有可能转义+符号并在那里留下一个空白。

dxxyhpgq

dxxyhpgq1#

url中编码为加号(+)的空格。您应该对url进行解码。

$input = urldecode($input);
hgncfbus

hgncfbus2#

不使用正则表达式:

$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];
bpzcxfmw

bpzcxfmw3#

从你的代码中,输出是这样的。

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);
zlhcx6iw

zlhcx6iw4#

通常,您需要考虑的字符数超过+个。
URL查询参数中的特殊字符(如“与”符号(&))和非ASCII字符必须使用百分比编码(%xx)进行转义。此外,提交HTML表单时,空格将使用+字符进行编码。
例如:

  • 字体系列“Jacques & Gilles”将转义为:

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()的第二个参数,以避免损坏现有变量。

相关问题