これを読んであなたも正規表現マスター!正規表現再入門 #phpcon2016 #phpcon2016_2

正規表現再入門 @shin1x1 新原 雅司
3
トゥギャッター開発まとめ @tg__dev

・最大量指定子→最長一致から試行していく ・最小長指定子→最短一致から試行していく ・マッチしない→結局全部やる #phpcon2016 #phpcon2016_2

2016-11-03 14:47:13
トゥギャッター開発まとめ @tg__dev

絶対長指定子 量指定子に+をつける ++,* +,?+など 強欲なマッチ、諦めないマッチと呼ばれる #phpcon2016 #phpcon2016_2

2016-11-03 14:47:58
トゥギャッター開発まとめ @tg__dev

preg_match('/P.++n/', 'Pen-...-Pen'); の時 ↓ マッチしない #phpcon2016 #phpcon2016_2

2016-11-03 14:48:39
ヤエガッシー @yaegassy

正規表現は頑張りやさん。欲張りなマッチ、控えめなマッチ、強欲なマッチ、諦めないマッチ #phpcon2016 #phpcon2016_2

2016-11-03 14:49:28
トゥギャッター開発まとめ @tg__dev

なぜか? バックトラック→マッチが失敗した時に前の正規表現に戻り、別のマッチを行う の動きが関係している #phpcon2016 #phpcon2016_2

2016-11-03 14:49:51
トゥギャッター開発まとめ @tg__dev

preg_match('/P.+n/' 'Pen-...-Pen'); の時P.+で全体がマッチするとnがマッチングしないので バックトラックし Pen...-PeをPen+とし最後のnをnにマッチングさせる #phpcon2016 #phpcon2016_2

2016-11-03 14:51:24
██████████████████████ @motchang

わたしは正規表現に入門すらしていなかったのがわかったありがたい 🙏 #phpcon2016

2016-11-03 14:51:36
トゥギャッター開発まとめ @tg__dev

preg_match('P.++n', 'Pen-...-Pen');の時は P.++がPen-...-Penにマッチングし、それを一つの塊のよう(アトミック)に扱うため、nがマッチングしないのをPen-...-Pen全体の失敗とみなす #phpcon2016_2

2016-11-03 14:53:15
トゥギャッター開発まとめ @tg__dev

そうするとこんどは PineApple-...Penとマッチングしようとするが同じ理由でこれも失敗する これを繰り返し、最後の Penまでいくがこれも失敗するので、 /P.++n/とPen-...-Penはマッチングしない #phpcon2016 #phpcon2016_2

2016-11-03 14:54:17
oharato @oharato

/P.++n/ 絶対最大量指定子 マッチした範囲をアトミックに扱う バックトラックで一文字短くして検査しない #phpcon2016

2016-11-03 14:54:59
トゥギャッター開発まとめ @tg__dev

絶対量指定子は一度マッチングした範囲をアトミックに扱い、バックトラック時に手放さなくなる アトミックグループでも同じ効果が得られる これらは、バックトラックの抑制に効果的である #phpcon2016 #phpcon2016_2

2016-11-03 14:55:21
リンク regex101.com Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript Online regex tester, debugger with highlighting for PHP, PCRE, Python, Golang and JavaScript.
トゥギャッター開発まとめ @tg__dev

regex101 正規表現のテストや、regex debuggerで「どういうステップを踏んでマッチングを行ったか」を確認できるサービス #phpcon2016 #phpcon2016_2

2016-11-03 14:57:25
██████████████████████ @motchang

めっちゃすごい / “Online regex tester and debugger: JavaScript, Python, PHP, and PCRE” htn.to/5THbYbx #regex #phpcon2016

2016-11-03 14:59:15
トゥギャッター開発まとめ @tg__dev

パフォーマンスへの影響 連続する空白を削除したい時など、単純なパターンに対して大量の文字列が来ると大変→最大量指定子を用いる、正規表現を用いないなどして対応する必要がある #phpcon2016 #phpcon2016_2

2016-11-03 15:03:15
トゥギャッター開発まとめ @tg__dev

ReDos 正規表現を悪用したDOS 2003年ごろから問題提起 マッチしないパターンを悪用した攻撃 #phpcon2016 #phpcon2016_2

2016-11-03 15:05:02
トゥギャッター開発まとめ @tg__dev

Evil regex pattern! preg_match('/(a+)+$/','aaaaaaaaaaaaaaaax'); ↓大したことなさそうだが…? >>>壊滅的なバックトラック<<< over 74999 steps! #phpcon2016 #phpcon2016_2

2016-11-03 15:07:48
トゥギャッター開発まとめ @tg__dev

しかし実際は…? PHPでは23ms程度で終わる ↓ バックトラック制限がある(デフォルトで100万回) PHPはバックトラック制限がかけられており、上限に達するとエラー終了する #phpcon2016 #phpcon2016_2

2016-11-03 15:09:32
トゥギャッター開発まとめ @tg__dev

これはpreg_matchだとfalseが返るだけなのでpreg_last_error()でエラーコードを取得する必要がある PREG_BACKTRACK_LIMIT_ERROR #phpcon2016 #phpcon2016_2

2016-11-03 15:10:48
トゥギャッター開発まとめ @tg__dev

この制限をはずすとPHPでも実験では6144msかかっており、危険(実際には制限をはずすことはできないが、許容量をめちゃくちゃ大きくすることができる) #phpcon2016 #phpcon2016_2

2016-11-03 15:12:00
トゥギャッター開発まとめ @tg__dev

まとめ ・マッチングの流れを意識しよう ・パフォーマンスへの影響を意識しよう ・正規表現をあえて使わない選択肢を意識しよう #phpcon2016 #phpcon2016_2

2016-11-03 15:14:46
トゥギャッター開発まとめ @tg__dev

安全でない値を正規表現をする時には十分気をつけることが必要そうです #phpcon2016 #phpcon2016_2

2016-11-03 15:15:36
いがにん @igayamaguchi

PHPカンファレンス、今年はライブ配信で見ているけど、正規表現の話はとても面白かった。内部的なところも考えて書かないとパフォーマンス問題を引き起こすよね #phpcon2016_2 #phpcon2016

2016-11-03 15:19:49