私はこれら2つの違いが何であるかを理解しようとしています:
preg_match('-^[^'.$inv.']+\.?$-' , $name
preg_match('-['.$inv.']-', $name
ありがとう
私はこれら2つの違いが何であるかを理解しようとしています:
preg_match('-^[^'.$inv.']+\.?$-' , $name
preg_match('-['.$inv.']-', $name
ありがとう
まず、に注意して$inv
ください。その内容によっては、正規表現でいくつかの注入を行うことができる場合があります。この問題を回避するには、を使用しますpreg_quote()
。
そうは言っても、最初の正規表現は次のようになります。
^ <-- the given string must begin with
[ <-- one of those characters
^ <-- inverse the accepted characters (instead of accepted characters, the following characters will be those that are not accepted)
$inv <-- characters
] <-- end of the list of characters (here not accepted characters)
+ <-- at least one character must be matched, more are accepted
\. <-- a '.'
? <-- the previous '.' isn't mandatory
$ <-- the given string must end here
$inv = 'abc.'
一致する場合:
def
def.
d
d.
一致しません:
.
、はグループ.
によって受け入れられないため、後であるとしても、少なくとも1つの文字が前にある必要があります[^abc.]
\.?
.
de.s
、.
はグループで受け入れられないため[^abc.]
、指定された文字列の最後にのみ含めることができます。\.?
a
deb
testc
teskopkl;;[!@#$b.
、b
'[^'.$inv.']+'
それは単純化することができます'^[^'.$inv.']+$'
(しかし忘れないでくださいpreg_quote
)
2つ目は次のようになります。
[ <-- one of those characters
$inv <-- characters
] <-- end of the list of characters (here accepted characters)
$inv = 'abc.'
一致する場合
a
、、またはの文字b
の少なくとも1つを含む任意の文字列c
.
a
、、、またはb
を含まない文字列とは一致しません。c
.
例証を簡単にするために、$inv = 'a'
…を仮定します。</p>
-^[^a]+\.?$-
キャレットとドル記号があるため、文字列全体と一致する必要があります。文字列は "a" 以外の文字で始まり、その後に "a" 以外の文字が 0 個以上続く必要があります。ただし、この文字列の最後の文字はドットにすることができます (したがって、ドットの後の疑問符)-[a]-
preg_match()
は文字列の最初の「a」に一致し、 and notを使用しているため、一致が見つかるとすぐに検索を停止しますpreg_match_all()
。ただし、最初のパターンは意味がありません。すでに\.
= [^a]
(英語に翻訳すると、ドットはすでに「a」ではありません)
[編集]文字クラスにドットがある場合、最初のパターンは実際には何かを意味します。
$inv
平易な英語では、最初の文字列は、文字列に含まれていない1つ以上の文字で始まり、オプションのピリオドで終わる行全体を探します。
2つ目は、の値で指定された1つの文字を一致させようとするだけです$inv
。
最初のパターンは、 の文字をまったく含まない行に一致し$inv
、オプションで行をピリオドで終了します。
2 番目のパターンは、 のいずれかの文字を含むものと一致し$inv
ます。
-
式の開始と終了を示すパターン区切り文字です。技術的には任意の文字にすることができますが、ほとんどの場合/
.^
文字列の先頭を示します[ ]
照合する文字セットをカプセル化します[^ ]
一致してはならない一連の文字をカプセル化し、その他の文字はすべて一致すると見なされます。+
前の文字または文字セットが 1 回以上一致する必要があることを示します。.
通常、任意の文字に一致する\.
ため、リテラルのピリオド文字を示すためにここでエスケープされます。?
前の文字が 0 回または 1 回一致する必要があることを示します。$
文字列の終わりを示します。['.$inv.']
それはより単純なものなので、最初は2番目のものから始めましょう。
$inv
。$inv
。
^[^'.$inv.']+\.?$
今2番目のもの:
$inv
( の^
内部[]
は否定一致です)。$inv
は、文字列の先頭にある必要があります (の^
外側は文字列[]
の先頭に一致します)。+
後の記号です[]
) 。\.?
はオプションのドット文字です)。$
は文字列の末尾に一致します)。どちらの場合も、$inv
正規表現の予約文字が含まれていると、失敗する (または予期しないことをする) ことに注意してください。preg_quote()
これを回避するために使用する必要があります。
えーと、全然違う表現です。「それらの違いは何ですか」ではなく、「それらの何が同じか」です。答え: あまりありません。
1 つ目は、先頭から $inv の最初の出現までの文字列に一致し、その後に 1 つまたは 0 のピリオドが続き、文字列が終了する必要があります。
2 番目は、$inv のみを含む文字列に一致します。
基本的に、それらはほぼ同じですが、最初の が可能な を許可します。最後に。