PHP preg_match边界内的单词

时间:2012-05-01 08:10:45

标签: php

我有一些文件要使用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

我想用简单的英语说:

  1. 查找以“one”开头的匹配项,返回:one_1.txt,one_2.txt
  2. 找到以“one-aaa”开头的匹配项,返回:one-aaa_1.txt,one-aaa_2.txt等
  3. 任何人都可以了解正确的正则表达式吗?

    由于

    更新2: 此前有人提出了避免贪婪的正则表达式的建议,并使用。*?相反,但答案被删除了。根据他的建议,它最终以这种方式运作:

    $match = '/^\b(' . $keyword . ')\b(.*?.txt$)/';
    

    我现在应该给谁一个答案?任何人都可以自愿写一个像上面那样的工作答案,或者改进它吗?

    更新3: 哎呀,我说得太早了。它没有用,但是当我改变键值对时,键重置了一些,这就是为什么我失去了双重包含的轨迹。对不起,上面还没有去。

    更新4: 如果它们与组不匹配,我最终使用附加条件来简单地排除输出。额外的代码和额外的扫描,坏,但至少它现在按预期工作。仍然使用上面建议的正则表达式。 仍在寻找终极正则表达式解决方案,如果有的话。如果不是,那么“否”应该是所选择的答案

    由于

1 个答案:

答案 0 :(得分:1)

当然 - “。*”允许其中的其他字符将其更改为:

$keyword = 'one';
$match = '/(^)' . $keyword . '(\.txt$)/';

$match = '/\b(' . $keyword . ')\b(\.txt$)/';

“。*”表示任何字符,出现0次或更多次......

修改

在看到您的更新后,假设one_10或one_100也可以存在。

您可以尝试:$match = '/^' . $keyword . '(_[0-9]+)?\.txt$/';

这意味着在关键字后面可能会出现一个带有数字的下划线。