0

特定の部分文字列を含む文字列に一致する正規表現を作成しようとしていますが、別の部分文字列も含まれていると失敗します。私はこの回答を見つけましたが、私のニーズに合わせて機能させる方法がわかりません。できるだけ具体的にするために:

  • はい、式の一部としてこれを行う必要があります。これを処理するコードにアクセスできません。
  • はい、1 つの式である必要があります。
  • PHP の正規表現フレーバーで動作する必要があります。pregを使用して評価されていると確信しています

私が何をしようとしているのかを理解するために、フィルタリングしようとしている一連の URL があります。「/somedir」を含む URL を一致させたいのですが、URL に「somestring」も含まれている場合は一致させたくありません。

そう、

  • www.somesite.com/somedir/index.html
  • www.somesite.com/somedir/somotherdir/index.html
  • www.somesite.com/somedir/somepage.html

すべて一致しますが、

  • www.somesite.com/somedir/somestring.html
  • www.somesite.com/somedir/somestring/index.html

どちらも失敗します。

4

1 に答える 1

0

別のパターンに囲まれていない場合にのみ、特定のパターンを受け入れる正規表現が必要です。

~
    (?(DEFINE)
        (?<ACCEPT> must-contain-pattern)
        (?<REFUSE> must-not-contain-pattern)
    )

    ^
        (?:(?!(?&REFUSE)).)*
            (?&ACCEPT)
        (?:(?!(?&REFUSE)).)*
    $
~ux

DEFINEブロックで、必要に応じて and パターンを定義すると、これが機能するはずですACCEPTREFUSE

編集: 2つの名前付きサブパターンを定義することにより、あなたのケースに合わせて調整された上記のパターン:

~
    (?(DEFINE)
        (?<ACCEPT> \Q/somedir\E)
        (?<REFUSE> \Qsomestring\E)
    )

    ^
        (?:(?!(?&REFUSE)).)*
            (?&ACCEPT)
        (?:(?!(?&REFUSE)).)*
    $
~ux
于 2013-03-07T18:01:08.587 に答える