Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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_Preg Match - Fatal编程技术网

PHP preg_匹配解析器-如何获取大写字母

PHP preg_匹配解析器-如何获取大写字母,php,regex,preg-match,Php,Regex,Preg Match,我有解析复制粘贴的mediainfo文本并创建数组的代码,但我有一个问题,因为在这段代码中,$line需要小写,否则不能打印任何内容 我怎样才能使它与大写字母一起工作 如果我将此更改为strotupper代码不再工作 $line=trim(strtolower($line)) 如果我想解析文件名,它总是小写的 示例: 原件: My.Home.Video.S01.E01.mp4 class Parser { // Mediainfo private $regex_section = "

我有解析复制粘贴的mediainfo文本并创建数组的代码,但我有一个问题,因为在这段代码中,
$line
需要小写,否则不能打印任何内容

我怎样才能使它与大写字母一起工作

如果我将此更改为
strotupper
代码不再工作

$line=trim(strtolower($line))

如果我想解析文件名,它总是小写的

示例:

原件:

My.Home.Video.S01.E01.mp4

class Parser {

// Mediainfo 
private $regex_section = "/^(?:(?:general|video|audio|text|menu)(?:\s\#\d+?)*)$/i";

public function parse($string)
{
    $string = trim($string);
    $lines = preg_split("/\r\n|\n|\r/", $string);

    $output = [];
    foreach ($lines as $line) {
        $line = trim(strtolower($line));
        if (preg_match($this->regex_section, $line)) {
            $section = $line;
            $output[$section] = [];
        }
        if (isset($section)) {
            $output[$section][] = $line;
        } else {
            $output['general'][] = $line;
        }
    } 
解析后:

my.home.video.s01.e01.mp4

class Parser {

// Mediainfo 
private $regex_section = "/^(?:(?:general|video|audio|text|menu)(?:\s\#\d+?)*)$/i";

public function parse($string)
{
    $string = trim($string);
    $lines = preg_split("/\r\n|\n|\r/", $string);

    $output = [];
    foreach ($lines as $line) {
        $line = trim(strtolower($line));
        if (preg_match($this->regex_section, $line)) {
            $section = $line;
            $output[$section] = [];
        }
        if (isset($section)) {
            $output[$section][] = $line;
        } else {
            $output['general'][] = $line;
        }
    } 
编辑:

全部代码:

如果我从此行中删除strtolower
$line=trim(strtolower($line))

我在打印输出时得到了这个。没有价值观


数组([常规]=>[视频]=>[音频]=>[文本]=>)

如果我理解正确,您希望按节对文件名进行分组

$filenames = [
    'My.Home.Video.S01.E01.mp4',
    'my.home.video.s01.e02.mp4',
    'My.Home.Audio.S01.E01.mp4'
];

// match specific strings between dots, capture as "section"
$pattern = '(\\.(?<section>general|video|audio|text|menu)\\.)i';

$output = [];
foreach ($filenames as $filename) {
    // default section
    $section = 'general';
    if (preg_match($pattern, $filename, $match)) {
        // lowercase captured section
        $section = strtolower($match['section'] ?? 'general');
    }
    if (isset($output[$section])) {
        // add to existing group
        $output[$section][] = $filename;
    } else {
        // add new group
        $output[$section] = [$filename];
    }
    
}

var_dump($output);

对文件进行分组可以更加直接/简单

查找文件名中点之间的文件“类别”,如果找到,则使用小写匹配的类别词作为输出数组中的第一级键。如果没有找到白名单上的分类词,那么它将被推送到常规子数组中

这里不需要子数组实例化

代码:()

输出:

array(2) {
  ["video"]=>
  array(2) {
    [0]=>
    string(25) "My.Home.Video.S01.E01.mp4"
    [1]=>
    string(25) "my.home.video.s01.e02.mp4"
  }
  ["audio"]=>
  array(1) {
    [0]=>
    string(25) "My.Home.Audio.S01.E01.mp4"
  }
}
array (
  'video' => 
  array (
    0 => 'My.Home.Video.S01.E01.mp4',
    1 => 'my.home.video.s01.e02.mp4',
  ),
  'audio' => 
  array (
    0 => 'My.Home.Audio.S01.E01.mp4',
  ),
)

专业提示:不要使用
\r\n |\n |\r
,而是使用
\r

它不必是小写的。您好,谢谢您的回复。我编辑了第一篇文章,添加了完整的代码,以及删除strtolower并打印输出后得到的结果。@Wiktor您的评论答案显示了一个存储在“常规”子数组中的“视频”文件名。当我发布一个更精细的答案时,我总是感到困惑,然后另一个答案会被UV'ed(这经常围绕着我的答案)。我一定有一些“特别的粉丝”,但他们能从指导研究人员远离更好的答案而冷落我中得到什么满足呢?我永远不会明白。