首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PHP中的多个模式获取字符串的部分?[回答:使用正则表达式,但具体如何使用?]

如何使用PHP中的多个模式获取字符串的部分?[回答:使用正则表达式,但具体如何使用?]
EN

Stack Overflow用户
提问于 2020-06-09 10:52:38
回答 2查看 111关注 0票数 1

我知道有类似的问题,(这个"如何在正则表达式中使用变量?“似乎很接近),但我想知道(最好的方法)如何解决my问题。

我定义了一些模式,用于检测一些文件名( MP3和其他音频文件)中的艺术家和标题。它类似于MP3tag (一个著名的MP3应用程序)将文件名转换为MP3标记的方式。怎么做?

下面是一个小测试应用程序。(阴性病例消失了,但你掌握了。)

代码语言:javascript
复制
<?php

define('SEARCHPATTERNS', array(
    '%track%. %artist% - %title%',
    '%track% - %artist% - %title%',
    '%track%. %title%',
    '%track% - %title%',
    '%title%'));

define('UNKNOWN_ARTIST_TITLE_ARRAY', array('?', '?'));

$fileNames = array(
    '0780. Janis Joplin - Mercedes Benz.mp3',
    '0780. Janis Joplin - Mercedes Benz.flac',

    '0780 - Janis Joplin - Mercedes Benz.mp3',
    '0780 - Janis Joplin - Mercedes Benz.flac',

    '0780. Mercedes Benz.mp3',
    '0780. Mercedes Benz.flac',

    '0780 - Mercedes Benz.mp3',
    '0780 - Mercedes Benz.flac',

    'Mercedes Benz.mp3',
    'Mercedes Benz.flac',
);

//Test some file names 
foreach($fileNames as $fileName)
{
    $titleAndArtist = GetTitleArtistUsingSearchPattern($fileName);
    var_dump($titleAndArtist);    
}

function GetTitleArtistUsingSearchPattern($fileName)
{
    foreach(SEARCHPATTERNS as $pattern)
    {
        $artist = '???????????'; //  Get it from fileName if it matches the pattern, but how?
        $title = '???????????'; //  Get it from fileName if it matches the pattern, but how?

        if(true) // If is matches.... How?
        {
            return array(
                empty($artist) ? UNKNOWN_ARTIST_TITLE_STRINGS[0] : $artist,
                empty($title) ? UNKNOWN_ARTIST_TITLE_STRINGS[1] : $title
            );
        } 
    }

    return UNKNOWN_ARTIST_TITLE_ARRAY;    

}

?>

我确信我必须使用正则表达式搜索(regex)。我现在想不清楚(多亏了科洛娜)。请帮帮我。非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-09 12:15:49

我以前做过这样的事情,因为一个剧本帮助我标记了我的音乐收藏。我用的是命名捕获组

您只需定义与结构内文件的不同部分相匹配的模式:(?P<name>pattern)。其中name是描述模式的标记。

示例:

代码语言:javascript
复制
$patterns = [
  //This will match `00. artist - title.ext`
  '/(?P<track>[0-9]{2})\.\s(?P<artist>.+)\s-\s(?P<title>.+)\.([a-z0-9]{3,4})/i',
  //This will match `00. title.ext`
  '/(?P<track>[0-9]{2})\.\s(?P<title>.+)\.([a-z0-9]{3,4})/i',
  //This will match `artist - album - 00 title.ext`
  '/(?P<artist>.+)\s-\s(?P<album>.+)\s-\s(?P<track>[0-9]{2})\s(?P<title>.+)\.[a-z0-9]{3,4}/i'

  // and so on...
];

$filename = "01. Cool Band - Song Title.flac";
$matches = [];
foreach($patterns as $pattern) {
  preg_match($pattern, $filename, $matches);

  //Matched artist?
  $artist = $matches['artist'] ?? false;

  //Matched song title?
  $title = $matches['title'] ?? false;

  //Matched album?
  $album = $matches['album'] ?? false;

  //etc...
}
票数 1
EN

Stack Overflow用户

发布于 2020-06-14 21:52:14

解决办法基本上是大卫·戈麦斯的建议。就像一种魅力。我无法想象他们对这个特殊问题还有很多其他好的解决办法。下面是我的实现(类的一部分):

代码语言:javascript
复制
private function GetTrackInfoFromFileName($fileName, &$item,  $defaultValue = '?')
{
    $patterns = array(          
        '/(?P<track>\d{1,4})\.\s(?P<artist>.+)\s-\s(?P<title>.+)\.([a-z0-9]{3,4})/i', //Matches `0000. artist - title.ext`
        '/(?P<track>\d{1,4})\s-\s(?P<artist>.+)\s-\s(?P<title>.+)\.([a-z0-9]{3,4})/i', //Matches `0000 - artist - title.ext`
        '/(?P<artist>.+)\s-\s(?P<title>.+)\.([a-z0-9]{3,4})/i', //Matches `artist - title.ext`
        '/(?P<track>\d{1,4})\.\s(?P<title>.+)\.([a-z0-9]{3,4})/i', //Matches `0000. title.ext`
    ); 

    $matches = [];

    foreach($patterns as $pattern)
    {
        preg_match($pattern, $fileName, $matches);
        if(empty($matches))
        {
            continue;
        }
        $item['artist'] = $matches['artist'] ?? $defaultValue;
        $item['title'] = $matches['title']  ?? $defaultValue;
        $item['track'] = isset($matches['track']) ? array($matches['track']) : array($defaultValue);
        return;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62280886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档