0

次のような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.txtone-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など

誰かが正しい正規表現に光を当てることができますか?

ありがとう

更新2: ここの誰かが以前に貪欲な正規表現を避けて。*を使用するための提案を提供しましたか?代わりに、しかし答えは削除されました。それは彼の提案に従って最終的にこのように機能します:

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

今、誰に答えを割り当てればよいですか?誰かが上記のような実用的な答え、またはそれの改善を書くことを志願できますか?

更新3: おっと、私はあまりにも早く話しました。それは機能しませんでしたが、キーと値のペアを変更すると、どういうわけかキーがリセットされたため、ダブルインクルージョンを見失いました。申し訳ありませんが、上記はまだ行きません。

更新4: グループと一致しない場合は、出力を単に除外するという追加の条件を最終的に作成しました。余分なコードと余分なスキャン、悪いですが、少なくとも今では期待どおりに機能します。上記の推奨正規表現を引き続き使用します。もしあれば、まだ究極の正規表現ソリューションを探しています。いいえの場合、「いいえ」が選択された答えである必要があります

ありがとう

4

1 に答える 1

1

もちろん、「。*」を使用すると、他の文字を次のように変更できます。

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

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

「。*」は、0回以上出現する任意の文字を意味します。

編集:

更新を確認した後、one_10またはone_100も存在する可能性があると想定します。

あなたが試すことができます:$match = '/^' . $keyword . '(_[0-9]+)?\.txt$/';

これは、キーワードの後に​​数字が続くアンダースコアが続く場合があることを意味します。

于 2012-05-01T08:15:52.727 に答える