0

私はこれら2つの違いが何であるかを理解しようとしています:

preg_match('-^[^'.$inv.']+\.?$-' , $name

preg_match('-['.$inv.']-', $name

ありがとう

4

6 に答える 6

2

まず、に注意して$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
  • 空の文字列。少なくとも1つの文字が一致する必要があります'[^'.$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.

于 2013-01-10T17:18:24.587 に答える
2

例証を簡単にするために、$inv = 'a'…を仮定します。</p>

  • -^[^a]+\.?$-キャレットとドル記号があるため、文字列全体と一致する必要があります。文字列は "a" 以外の文字で始まり、その後に "a" 以外の文字が 0 個以上続く必要があります。ただし、この文字列の最後の文字はドットにすることができます (したがって、ドットの後の疑問符)
  • -[a]-preg_match()は文字列の最初の「a」に一致し、 and notを使用しているため、一致が見つかるとすぐに検索を停止しますpreg_match_all()

ただし、最初のパターンは意味がありません。すでに\.= [^a](英語に翻訳すると、ドットはすでに「a」ではありません)

[編集]文字クラスにドットがある場合、最初のパターンは実際には何かを意味します。

于 2013-01-10T17:29:09.493 に答える
0

$inv平易な英語では、最初の文字列は、文字列に含まれていない1つ以上の文字で始まり、オプションのピリオドで終わる行全体を探します。

2つ目は、の値で指定された1つの文字を一致させようとするだけです$inv

于 2013-01-10T17:16:55.540 に答える
0

最初のパターンは、 の文字をまったく含まない行に一致し$inv、オプションで行をピリオドで終了します。

2 番目のパターンは、 のいずれかの文字を含むものと一致し$invます。

  • -式の開始と終了を示すパターン区切り文字です。技術的には任意の文字にすることができますが、ほとんどの場合/.
  • ^文字列の先頭を示します
  • [ ]照合する文字セットをカプセル化します
  • [^ ]一致してはならない一連の文字をカプセル化し、その他の文字はすべて一致すると見なされます。
  • +前の文字または文字セットが 1 回以上一致する必要があることを示します。
  • .通常、任意の文字に一致する\.ため、リテラルのピリオド文字を示すためにここでエスケープされます。
  • ?前の文字が 0 回または 1 回一致する必要があることを示します。
  • $文字列の終わりを示します。
于 2013-01-10T17:15:11.277 に答える
0
['.$inv.']

それはより単純なものなので、最初は2番目のものから始めましょう。

  • これは、変数内の文字列に含まれる文字のいずれか 1 つを含む文字列と単純に一致します$inv
  • のその文字の前後に何かを含めることができます$inv

 

^[^'.$inv.']+\.?$

今2番目のもの:

  • これは、 の文字以外を含む文字列に一致します$inv( の^内部[]は否定一致です)。
  • の一部ではない一致$invは、文字列の先頭にある必要があります (の^外側は文字列[]の先頭に一致します)。
  • 文字列には、一致する文字を好きなだけ含めることができます (1 つ以上; の+後の記号です[]) 。
  • その後、オプションでドットを付けることができます (これ\.?はオプションのドット文字です)。
  • その後は何もありません ($は文字列の末尾に一致します)。

どちらの場合も、$inv正規表現の予約文字が含まれていると、失敗する (または予期しないことをする) ことに注意してください。preg_quote()これを回避するために使用する必要があります。

えーと、全然違う表現です。「それらの違いは何ですか」ではなく、「それらの何が同じか」です。答え: あまりありません。

于 2013-01-10T17:22:16.960 に答える
-1

1 つ目は、先頭から $inv の最初の出現までの文字列に一致し、その後に 1 つまたは 0 のピリオドが続き、文字列が終了する必要があります。

2 番目は、$inv のみを含む文字列に一致します。

基本的に、それらはほぼ同じですが、最初の が可能な を許可します。最後に。

于 2013-01-10T17:13:32.830 に答える