我有一些文件要使用preg_match扫描模式,如:
文件名:
(a group: one)
one.txt
(another group: one-aaa)
one-aaa.txt
one-aaa_1.txt
one-aaa_b.txt
one-aaa_3.txt
one-aaa_whatever.txt
(some other group: one-bbb)
one-bbb.jpg
one-bbb_1.txt
one-bbb_2.txt
one-bbb_t.txt
one-bbb_whatever.txt
该组由名称定义(因此:one,one-aaa,one-bbb是不同的组),并且仅限于文件.txt。
请不要建议使用不同的目录。这些文件已分散在某些目录中,我需要一种方法来按关键字查找匹配项,而不是目录。
现在我可以通过指定“one”,“one-aaa”等手动定义组,但是preg_match有问题。我的preg_match将“one”和“one-aaa”作为单个组返回:
$keyword = 'one';
$match = '/(^)' . $keyword . '(.*\.txt$)/';
$match = '/\b(' . $keyword . ')\b(.*\.txt$)/';
预期回报: 此时就把one.txt存盘
意外收益: 此时就把one.txt存盘 one-aaa.txt等
更新1: 当关键字更改为“one-aaa”时,我希望它返回:one-aaa.txt,one-aaa_1.txt等。 我分组的方式是:
$keyword = str_replace('_', ' ', $file->name);
returns: one, one-aaa, one-bbb, etc
我想用简单的英语说:
任何人都可以了解正确的正则表达式吗?
由于
更新2: 此前有人提出了避免贪婪的正则表达式的建议,并使用。*?相反,但答案被删除了。根据他的建议,它最终以这种方式运作:
$match = '/^\b(' . $keyword . ')\b(.*?.txt$)/';
我现在应该给谁一个答案?任何人都可以自愿写一个像上面那样的工作答案,或者改进它吗?
更新3: 哎呀,我说得太早了。它没有用,但是当我改变键值对时,键重置了一些,这就是为什么我失去了双重包含的轨迹。对不起,上面还没有去。
更新4: 如果它们与组不匹配,我最终使用附加条件来简单地排除输出。额外的代码和额外的扫描,坏,但至少它现在按预期工作。仍然使用上面建议的正则表达式。 仍在寻找终极正则表达式解决方案,如果有的话。如果不是,那么“否”应该是所选择的答案
由于
答案 0 :(得分:1)
当然 - “。*”允许其中的其他字符将其更改为:
$keyword = 'one';
$match = '/(^)' . $keyword . '(\.txt$)/';
$match = '/\b(' . $keyword . ')\b(\.txt$)/';
“。*”表示任何字符,出现0次或更多次......
修改强>
在看到您的更新后,假设one_10或one_100也可以存在。
您可以尝试:$match = '/^' . $keyword . '(_[0-9]+)?\.txt$/';
这意味着在关键字后面可能会出现一个带有数字的下划线。