まず、正規表現には修正が必要だと思います。あなたが持っているものを見てみましょう:
test.com(\/\??index_.*.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)
?の開始時にオプションを使用する場合index...は、2番目の選択肢によってすでに処理されています。
test.com(\/index_.*.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)
(.*)これで、実際に前にリテラルがあった場合は、おそらく最初のものだけを許可する必要があり?ます。それ以外の場合は一致しtest.com/index_fb2.phpanystringhereandyouprobablydon'twantthatます。したがって、対応するオプションのマーカーを移動します。
test.com(\/index_.*.php(\?(.*))?|\/\?(.*)|\/|)+(\s)*(?!.)
現在.*、任意の文字を可能な限り消費します。また、.前のphp文字はすべての文字を消費します。これは、との両方test.com/index_fb2phpを許可することを意味しますtest.com/index_fb2.html?someparam=php。.これをリテラルにして、疑問符以外の文字のみを許可しましょう。
test.com(\/index_[^?]*\.php(\?(.*))?|\/\?(.*)|\/|)+(\s)*(?!.)
これで、ファイル名もオプションにすると、1番目と2番目と3番目のオプションを1つにまとめることができます。
test.com(\/(index_[^?]*\.php)?(\?(.*))?|)+(\s)*(?!.)
最後に、内部はすべての可能な繰り返しをすでに処理できる+ため、を削除することができます。(.*)また(something|)、と同じ(something)?です:
test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*(?!.)
入力例を見ると、これは実際に一致させたいものに近いようです。
次に、あなたの質問に答えます。何をするかは、モード(?!.)を使用するかどうかによって異なります。singlelineそうした場合、文字列の終わりに到達したことを表明します。この場合\Z、それを単に文字列の終わりに一致する。に置き換えることができます。そうでない場合は、行の終わりに到達したと主張します。この場合は使用できます$が、行末にも一致するように複数行モードも使用する必要があります$。
したがって、singlelineモードを使用する場合(つまり、文字列ごとにURLが1つしかないことを意味します)、次のように使用します。
test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*\Z
モードを使用しない場合singleline(おそらく、独自の行に複数のURLを含めることができることを意味します)、multiline代わりにモードとこの種のアンカーも使用する必要があります。
test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*$