因此,我已经独自完成了这一步,但似乎我已经发现了我的PHP知识的局限性(根本不是很多!)。该脚本用于过滤文件名(游戏ROM / ISO等)。它也有其他过滤方式,但我只是强调了我要添加的部分。我想要一个外部.txt文件,我可以像这样放置文件名(以单个换行符分隔):
Pacman 2 (USA)
Space Invaders (USA)
Asteroids (USA)
Something Else (Europe)
然后运行脚本将搜索目录,并将所有匹配的文件名放在“已删除”文件夹中。它使用它使用的所有其他过滤技术可以很好地循环。我只是想添加自己的(不成功!)
$gameList = trim(shell_exec("ls -1"));
$gameArray = explode("\n", $gameList);
$file = file_get_contents('manualremove.txt');
$manualRemovePattern = '/(' . str_replace(PHP_EOL, "|", $file) . ')/';
shell_exec('mkdir -p Removed');
foreach($gameArray as $thisGame) {
if(!$thisGame) continue;
// Probably already been removed
if(!file_exists($thisGame)) continue;
if(preg_match ($manualRemovePattern , $thisGame)) {
echo "{$thisGame} is on the manual remove list. Moving to Removed folder.\n";
shell_exec("mv \"{$thisGame}\" Removed/");
continue;
因此,当我在.txt文件中放置没有空格或方括号的游戏名称时,此方法有效。但是空格或方括号(或两者)破坏了它的功能。有人可以帮我吗?
非常感谢!
答案 0 :(得分:1)
替换提供的代码中的第四行
$manualRemovePattern = "/(?:" . implode("|", array_map(function($i) {
return preg_quote(trim($i), "/");
}, explode(PHP_EOL, $file))) . ')/';
主要思想是:
explode(PHP_EOL, $file)
将获得的文件内容分成几行array_map
完成)\
)之前添加转义/
,这是通过preg_quote(trim($i), "/")
< / li>
trim
中的所有前导/后跟空格。要将它们匹配为整个单词,请使用单词边界:
$manualRemovePattern = '/\b(?:' . implode('|', array_map(function($i) {
return preg_quote(trim($i), '/');
}, explode(PHP_EOL, $file))) . ')\b/';
要将它们匹配为整个字符串,请使用^
/ $
锚点:
$manualRemovePattern = '/^(?:' . implode('|', array_map(function($i) {
return preg_quote(trim($i), '/');
}, explode(PHP_EOL, $file))) . ')$/';