・最大量指定子→最長一致から試行していく ・最小長指定子→最短一致から試行していく ・マッチしない→結局全部やる #phpcon2016 #phpcon2016_2
2016-11-03 14:47:13絶対長指定子 量指定子に+をつける ++,* +,?+など 強欲なマッチ、諦めないマッチと呼ばれる #phpcon2016 #phpcon2016_2
2016-11-03 14:47:58preg_match('/P.++n/', 'Pen-...-Pen'); の時 ↓ マッチしない #phpcon2016 #phpcon2016_2
2016-11-03 14:48:39正規表現は頑張りやさん。欲張りなマッチ、控えめなマッチ、強欲なマッチ、諦めないマッチ #phpcon2016 #phpcon2016_2
2016-11-03 14:49:28なぜか? バックトラック→マッチが失敗した時に前の正規表現に戻り、別のマッチを行う の動きが関係している #phpcon2016 #phpcon2016_2
2016-11-03 14:49:51preg_match('/P.+n/' 'Pen-...-Pen'); の時P.+で全体がマッチするとnがマッチングしないので バックトラックし Pen...-PeをPen+とし最後のnをnにマッチングさせる #phpcon2016 #phpcon2016_2
2016-11-03 14:51:24preg_match('P.++n', 'Pen-...-Pen');の時は P.++がPen-...-Penにマッチングし、それを一つの塊のよう(アトミック)に扱うため、nがマッチングしないのをPen-...-Pen全体の失敗とみなす #phpcon2016_2
2016-11-03 14:53:15そうするとこんどは PineApple-...Penとマッチングしようとするが同じ理由でこれも失敗する これを繰り返し、最後の Penまでいくがこれも失敗するので、 /P.++n/とPen-...-Penはマッチングしない #phpcon2016 #phpcon2016_2
2016-11-03 14:54:17/P.++n/ 絶対最大量指定子 マッチした範囲をアトミックに扱う バックトラックで一文字短くして検査しない #phpcon2016
2016-11-03 14:54:59絶対量指定子は一度マッチングした範囲をアトミックに扱い、バックトラック時に手放さなくなる アトミックグループでも同じ効果が得られる これらは、バックトラックの抑制に効果的である #phpcon2016 #phpcon2016_2
2016-11-03 14:55:21regex101 正規表現のテストや、regex debuggerで「どういうステップを踏んでマッチングを行ったか」を確認できるサービス #phpcon2016 #phpcon2016_2
2016-11-03 14:57:25めっちゃすごい / “Online regex tester and debugger: JavaScript, Python, PHP, and PCRE” htn.to/5THbYbx #regex #phpcon2016
2016-11-03 14:59:15パフォーマンスへの影響 連続する空白を削除したい時など、単純なパターンに対して大量の文字列が来ると大変→最大量指定子を用いる、正規表現を用いないなどして対応する必要がある #phpcon2016 #phpcon2016_2
2016-11-03 15:03:15ReDos 正規表現を悪用したDOS 2003年ごろから問題提起 マッチしないパターンを悪用した攻撃 #phpcon2016 #phpcon2016_2
2016-11-03 15:05:02Evil regex pattern! preg_match('/(a+)+$/','aaaaaaaaaaaaaaaax'); ↓大したことなさそうだが…? >>>壊滅的なバックトラック<<< over 74999 steps! #phpcon2016 #phpcon2016_2
2016-11-03 15:07:48しかし実際は…? PHPでは23ms程度で終わる ↓ バックトラック制限がある(デフォルトで100万回) PHPはバックトラック制限がかけられており、上限に達するとエラー終了する #phpcon2016 #phpcon2016_2
2016-11-03 15:09:32これはpreg_matchだとfalseが返るだけなのでpreg_last_error()でエラーコードを取得する必要がある PREG_BACKTRACK_LIMIT_ERROR #phpcon2016 #phpcon2016_2
2016-11-03 15:10:48この制限をはずすとPHPでも実験では6144msかかっており、危険(実際には制限をはずすことはできないが、許容量をめちゃくちゃ大きくすることができる) #phpcon2016 #phpcon2016_2
2016-11-03 15:12:00まとめ ・マッチングの流れを意識しよう ・パフォーマンスへの影響を意識しよう ・正規表現をあえて使わない選択肢を意識しよう #phpcon2016 #phpcon2016_2
2016-11-03 15:14:46安全でない値を正規表現をする時には十分気をつけることが必要そうです #phpcon2016 #phpcon2016_2
2016-11-03 15:15:36PHPカンファレンス、今年はライブ配信で見ているけど、正規表現の話はとても面白かった。内部的なところも考えて書かないとパフォーマンス問題を引き起こすよね #phpcon2016_2 #phpcon2016
2016-11-03 15:19:49