在PHP中从一个简单的正则表达式中排除几个单词


Exclude a few words from a simple regex in PHP

我正在对我的驱动器上的几个文件夹进行分类,我想使用这个正则式(这个有效)清除低质量的文件:

xvid|divx|480p|320p|DivX|XviD|DIVX|XVID|XViD|DiVX|DVDSCR|PDTV|pdtv|DVDRip|dvdrip|DVDRIP

现在一些文件名是高清晰度的,但仍然有DVD或XviD文件名,但也有1080p, 720p, 1080i或720i。我需要一个单一的正则表达式来匹配上面的一个,但排除这些词1080p, 720p, 1080i或720i。

使用两个正则表达式

1查找是否与

匹配
1080p|720p|1080i|720i

如果没有,那就是上面没有找到匹配,检查是否匹配:

xvid|divx|480p|320p|DivX|XviD|DIVX|XVID|XViD|DiVX|DVDSCR|PDTV|pdtv|DVDRip|dvdrip|DVDRIP

正则表达式不支持反向匹配,您可以使用负查找,但对于这个任务,我不认为它们是合适的。当你检查1080p-divx的所有情况时,你把负面的目光放在前面,但是它没有捕捉到divx-10bit-1080p,你不能在简单的正则表达式中实现这一点。

^(?!.*(?:1080p|720p|1080i|720i)).*(?:xvid|divx|480p|320p|DivX|XviD|DIVX|XVID|XViD|DiVX|DVDSCR|PDTV|pdtv|DVDRip|dvdrip|DVDRIP)

这将匹配您的搜索字符串,但如果字符串中也有1080p|720p|1080i|720i则失败。

你可以这样做:

<pre><?php
$subjects = array('Arrival of the train at La Ciotat station.avi',
                  'Gardenator II - multi - DVDrip - 720i.mkv',
                  'The adventures of Roberto the bear - divx.avi',
                  'Tokyo’s Ginza District - dvdrip.mkv');
$pattern = '~(?(DEFINE)(?<excl>(?>d(?>vd(?>rip|scr)|ivx)|pdtv|xvid|320p|480p)))
             (?(DEFINE)(?<keep>(?>[^17]+?|1(?!080[ip])|7(?!20[ip]))))
             ^'g<keep>*'g<excl>'g<keep>*$  ~ix';
foreach($subjects as $subject) {
    if (preg_match($pattern, $subject)) echo $subject."'n"; }

主要目的是避免对每个字符进行前向测试。