まず、正規表現には修正が必要だと思います。あなたが持っているものを見てみましょう:
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)*$