preg_match-从.txt文件中的行开始(带有空格和括号!)

时间:2018-06-21 07:42:09

标签: php regex preg-match

因此,我已经独自完成了这一步,但似乎我已经发现了我的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文件中放置没有空格或方括号的游戏名称时,此方法有效。但是空格或方括号(或两者)破坏了它的功能。有人可以帮我吗?

非常感谢!

1 个答案:

答案 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))) . ')$/';