ホームページ >バックエンド開発 >PHPチュートリアル >この PHP 正規表現 preg_match が時々 false を返すのはなぜですか?
タイトルの通り:
リーリータイトルの通り:
リーリー
今フィルタリングしているコードを見てください。 int(0) は一致がないことを意味し、int(1) は一致が成功したことを意味します。
グループキャプチャはむやみに使用できず、通常の記述は簡潔にし、できるだけ操作効率を向上させ、不要な変数を格納しないようにする必要があります。何をしているのかを理解するには、通常のエンジンのバックトラッキング原理を理解する必要があります。
より基本的な知識としては、少なくとも、貪欲なマッチングと非貪欲なマッチングのマッチング原理と運用効率の違いを理解する必要があります。
原文:
リーリー変更:
リーリーご質問を元に分析してみます。
質問の最初のコードを例として挙げます:
リーリー合計 74781 ステップ、70,000 ステップ以上かかりました!
上で修正したものに変更しました
後:
必要なステップはわずか 34 ステップです。
マッチングプロセスを分析します。
質問の件名:
修正されたマッチング手順:
74781ステップ: 34ステップは約2200%で、効率は本当に違います。
----12月29日追記---
定期学習について:
perlの学習で詳しく勉強しました。個人的には、正規表現をうまく活用するには次の点に従う必要があると考えています:
1 貪欲なマッチングと非貪欲なマッチングを区別する
2 アンカーを使用するようにする
3 グループ化できるものはグループ化するようにする
4 代わりに列挙する場合は、メタキャラクターを逆フィルターして合計する方が良いです。要約すると、たとえば、[a-zA-Z0-9]+ は w+ ほど良くありません。特定のシナリオでは、w+ は 1+ ほど良くありません。アンカー文字 (アンカー ワード、?= ?>、?! の順方向および逆方向の事前検索) を追加すると、いわゆる量指定子のネストが高速になります (貪欲一致を使用しないでください)。 +* を使用すると、バックトラック、つまりバックトラックの数を大幅に減らすことができます。たとえば、100 万平方キロメートル離れて並んでいる 2 本の木はすべてです。あなたは男性です。100 個の特徴を説明する必要はありません。1 つずつ確認させてください。 。
上。
preg_match() はパターンの一致数を返します。 preg_match() は最初の一致後に検索を停止するため、その値は 0 (一致なし) または 1 になります。 preg_match_all() は、サブジェクトを最後まで検索するという点でこれとは異なります。 エラーが発生した場合、preg_match() は FALSE を返します。