0

私は正規表現を持っていますが、それを単純化することは可能ですか?

preg_match_all('/([0-9]{2}\.[0-9]{2}\.[0-9]{4}) (([01]?[0-9]|2[0-3])\:[0-5][0-9]\:[0-5][0-9]?) поступление на сумму (\d+) WM([A-Z]) от корреспондента (\d+)/', $message->getMessageBody(), $info);
4

2 に答える 2

0

フリースペース モードといくつかのコメントを使用することから始めることができます (これは、あなたと他のすべての人の理解に役立ち、単純化が容易になります)。ただし、ここではリテラル スペースを括弧で囲む必要があることに注意してください。

/
(             # group 1
  [0-9]{2}\.[0-9]{2}\.[0-9]{4}
              # match a date
)
[ ]
(             # group 2
  (           # group 3
    [01]?[0-9]# match an hour from 0 to 19
  |           # or
    2[0-3]    # match an hour from 20 to 23
  )
  \:       
  [0-5][0-9]  # minutes
  \:
  [0-5][0-9]? # seconds
)
[ ]поступление[ ]на[ ]сумму[ ]
              # literal text
(\d+)         # a number into group 4
[ ]WM         # literal text
([A-Z])       # a letter into group 5
[ ]от[ ]корреспондента[ ]
              # literal text
(\d+)         # a number into group 6
/x

ここで、最後の部分を単純化することはできません-括弧で囲まれたものをキャプチャしたくない場合を除き、括弧のほとんどを単純に省略できます.

\dの代わりにを使用することで、式を少し短くすることができます。\dこの場合、\d\dは よりもさらに短くなり\d{2}ます。

次に、コロンをエスケープする必要はありません。

最後に、あなたの秒数に何かおかしな点があるようです。1 桁の秒を許可する場合は、その後の the ではなく、オプション0-5にします。\d

/
(             # group 1
  \d\d\.\d\d\.\d{4}
              # match a date
)
[ ]
(             # group 2
  (           # group 3
    [01]?\d   # match an hour from 0 to 19
  |           # or
    2[0-3]    # match an hour from 20 to 23
  )
  :       
  [0-5]\d     # minutes
  :
  [0-5]?\d    # seconds
)
[ ]поступление[ ]на[ ]сумму[ ]
              # literal text
(\d+)         # a number into group 4
[ ]WM         # literal text
([A-Z])       # a letter into group 5
[ ]от[ ]корреспондента[ ]
              # literal text
(\d+)         # a number into group 6
/x

私はそれがそれほど単純になるとは思わない。

于 2013-08-09T16:08:22.510 に答える