Php 我们如何使用正则表达式从文件名检查电影是否为3d

Php 我们如何使用正则表达式从文件名检查电影是否为3d,php,regex,pattern-matching,Php,Regex,Pattern Matching,我的文件夹里有某个文件 PARANORMAN_3D_hsbs_.mkv RunAllNight_Filmbank.mkv SHUTTER_ISLAND_airwave.mkv THE_CHANGE_UP_airwave.mkv The_Avenger_3D_Trailer1.mkv moviename (year).3d.hsbs.mkv moviename 3d sbs.mkv moviename.3D-HTAB.mkv moviename-3D.sbs-720p

我的文件夹里有某个文件

PARANORMAN_3D_hsbs_.mkv      
RunAllNight_Filmbank.mkv         
SHUTTER_ISLAND_airwave.mkv
THE_CHANGE_UP_airwave.mkv
The_Avenger_3D_Trailer1.mkv
moviename (year).3d.hsbs.mkv
moviename 3d sbs.mkv
moviename.3D-HTAB.mkv
moviename-3D.sbs-720p.mkv
jurassic_world_airwave_3D_hsb.mkv
根据科迪论坛

文件名中的以下任何术语都应触发3D检测:

3DTAB,3D.TAB,HTAB,3DSBS,3D.SBS,HSBS
我所尝试的

 <?php
    $pattern="(7F7|3DSBS|3D.SBS|HSBS|H.SBS|H-SBS| SBS |FULL-SBS|FULL.SBS|)";
    $file_name="PARANORMAN_3D_hsbs_.mkv";
    if (preg_match($pattern, $file_name)) {
        echo "A match was found.";
    } else {
        echo "A match was not found.";
    }

您已经有了要匹配的不同单词的替换:

(7F7|3DSBS|3D.SBS|HSBS|H.SBS|H-SBS| SBS |FULL-SBS|FULL.SBS)
然后你在评论中写下你不想与之匹配的文字。你也可以这样命名,它必须跟在一个特殊的字符后面,但你不能清楚地说出什么是所有的特殊字符

在这种情况下,使用正则表达式的一个很好的方法是使用一个特殊的锚点,该锚点写为
\b
。你可以把它放在你的替代品前面:

(\b(7F7|3DSBS|3D.SBS|HSBS|H.SBS|H-SBS| SBS |FULL-SBS|FULL.SBS))
 ^^^                                                         ^
您也可以将替代设置为非捕获,因为您不需要它来捕获(请参阅以了解内括号):

你可能想:

如果锚定在您的情况下不起作用,您可以将其替换为与任何特殊字符匹配的正则表达式,例如,使用字符类:

([_-](?:7F7|3DSBS|3D.SBS|HSBS|H.SBS|H-SBS| SBS |FULL-SBS|FULL.SBS))i
([._ ~,](?:7F7|3DSBS|3D.SBS|HSBS|H.SBS|H-SBS| SBS |FULL-SBS|FULL.SBS))i
这将只允许在下划线或破折号之后使用,并且不再允许在文件名开头的替换中使用任何单词(在您的情况下可能甚至需要这样做)

或者使用您的角色类:

([_-](?:7F7|3DSBS|3D.SBS|HSBS|H.SBS|H-SBS| SBS |FULL-SBS|FULL.SBS))i
([._ ~,](?:7F7|3DSBS|3D.SBS|HSBS|H.SBS|H-SBS| SBS |FULL-SBS|FULL.SBS))i

我的代码正在处理olny问题,当文件名类似于
PARANORMAN3D
时,它也给了我真实的信息我只是在任何特殊字符之后检查这些单词是什么如果文件名是
paranormanu 3D\u hsbs\
它给出的是真的,但是如果文件名
PARANORMAN3Dhsbs
我想要假的。我的代码在任何情况下都是正确的,特殊字符是[,,,,,(,)]特殊字符是
[,,,,,,,,)]
@hakre请检查更新的文件名,也请查看KODI时的文件名检测。它使用了一个更短的正则表达式模式。非常感谢,我只想知道一件事,
?:7F7
?这在子模式中解释过,它使组无法捕获。捕获意味着您可以提取数据,因为您不需要它,所以可以将替代设置为非捕获。非常感谢!!谢谢你给我解释正则表达式!!不客气。Checkout以及关于regex语法的PHP手册和我链接的其他网站,它们都解释了regex的工作原理,如果遇到问题或在编写模式之前,这一点特别有用。