Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_是否匹配两种不同(但有些相似)的字符串模式?_Php_Regex_Switch Statement_Preg Match - Fatal编程技术网

Php preg_是否匹配两种不同(但有些相似)的字符串模式?

Php preg_是否匹配两种不同(但有些相似)的字符串模式?,php,regex,switch-statement,preg-match,Php,Regex,Switch Statement,Preg Match,我正在循环使用一个PHP文件名数组来构建一个选择列表,其中包含匹配两种不同模式的文件 我让它处理一种或另一种模式,但不能同时处理两种模式: foreach ($file_array as $file_link) { $p = '~(-([a-z]{2})\.pdf(|(-([a-z]{4})\.pdf)~'; preg_match($p, $file_link, $matches); switch ($matches[1]) { case 'en'

我正在循环使用一个PHP文件名数组来构建一个选择列表,其中包含匹配两种不同模式的文件

我让它处理一种或另一种模式,但不能同时处理两种模式:

    foreach ($file_array as $file_link) {
    $p = '~(-([a-z]{2})\.pdf(|(-([a-z]{4})\.pdf)~';
    preg_match($p, $file_link, $matches);
    switch ($matches[1]) {
        case 'en':
            $link_array[1] = array('English', $file_link);
            break;
        case 'ja':
            $link_array[2] = array('日本語', $file_link);
            break;
        ...
        case 'ptbr':
            $link_array[13] = array('Português brasileiro', $file_link);
            break;
        case 'ptpt':
            $link_array[14] = array('Português europeu', $file_link);
            break;
        ...
    }
    ...
}
$file_数组中的文件格式如下:

  • 文件名-en.pdf
  • file-name-ja.pdf
  • 文件名-ptbr.pdf
  • 文件名:ptpt.pdf
我希望在
-([a-z]{2})pdf
-([a-z]{4})pdf
模式上匹配。我在上面的
$p='~([a-z]{2})\.pdf([a-z]{4})\.pdf)~';
中缺少了什么才能让它正常工作

此外,有没有更好的方法来解决这一问题,即将文件名更改为另一种格式(我正试图避免这种情况)

我的客户实际上希望文件采用这种格式,但这似乎更麻烦:

  • 文件名-pt-br.pdf
  • 文件名-pt-pt.pdf
谢谢


John

以非捕获组
(?:-[a-z]{2})的形式使用此正则表达式并进行附加检查。
将捕获
pt br

 `-([a-z]{2}(?:-[a-z]{2})?|[a-z]{4})\.pdf`

 $p = "~-([a-z]{2}(?:-[a-z]{2})?|[a-z]{4})\.pdf~";

请查看。

如果要在单个正则表达式中执行此操作,请尝试以下操作(请原谅
%
边界字符,与
~
不同。
x
修饰符用于允许注释

$regex = '%
-                            # starting -
(                            # start grouping parenthesis 
    [a-z]{2}                 #     a through z repeated twice
    |                        #     or
    [a-z]{4}                 #     a through z repeated four times
)                            # end group
\.pdf$                       # string ends in .pdf
%x';
此外,尽管正则表达式总是一个有趣的练习,但不要害怕为每个模式使用一个正则表达式。虽然理论上性能会受到影响,但它很可能不会影响您的应用程序。同样,不要害怕为一些更简单的爆炸/内爆而避开正则表达式

$parts      = explode('.', $filename);
$extension  = array_pop($parts);
$full       = implode('',  $parts);  
$parts      = explode('-', $full);

$identifier = array_pop($parts);

switch($identifier)
{
    case 'en':
        break;
    //etc...
}

谢谢@Stribizev!这似乎正是我所需要的。我也很感谢解释性演示的有用链接。谢谢你的建议Alan。这可能是未来一个有用的方法。我曾想过这样做,但上面的@Stribizev answer似乎正是我所需要的。