php 置換えとかで使う正規表現について
PHPのpreg_replace()とかで使う正規表現についてまとめてみた。
- $str = "abcdabcdda";
- // 特定の文字を除く
- echo '「d」を除いた文字全部:' . preg_replace('/[^d]/', 'z', $str) . "\n";
- //結果:「d」を除いた文字全部:zzzdzzzddzz
- // 特定の文字のみ
- echo '「a」と「c」:' . preg_replace('/[ac]/', 'z', $str) . "\n";
- //結果:「a」と「c」:zbzdzbzddz
- // 直前の文字が0個or1個
- echo '「da」or「a」:' . preg_replace('/d?a/', 'z', $str) . "\n";
- //結果:「da」or「a」:zbczbcdz
最長一致と最短一致
マッチする文字が複数あったときの処理。
「リンゴ、ミカン、リンゴ、メロン、ミカン、メロン」って文字があり「リンゴ~メロン」を一致させる場合、「最長一致」ってヤツは「最後のメロン」までが一致で「リンゴ、ミカン、リンゴ、メロン、ミカン、メロン」が対象になる。
「最短一致」ってヤツは最初の「メロン」までが一致で「リンゴ、ミカン、リンゴ、メロン」が対象になる。
- $str = "abcdabcdda";
- // 「a]のあとに任意の文字があり最後に表示される「d」まで。
- echo '最長一致:' . preg_replace('/a.*d/', 'z', $str) . "\n";
- //結果:最長一致:za
- // 「a]のあとに任意の文字があり次に表示される「d」まで。
- echo '最短一致:' . preg_replace('/a.*?d/', 'z', $str) . "\n";
- //結果:最短一致:zzda
0回以上と1回以上
0回以上ってことは含まなくてもOK。
「リンゴ、ミカン、リンゴ、メロン、ミカン、メロン」って文字があり「ミカンが0回以上で続いてメロン」を対象とするなら「メロン」と「ミカン、メロン」が対象になる。
「ミカンが1回以上で続いてメロン」を対象とするなら「ミカン、メロン」が対象になる。
- $str = "abcdabcdda";
- // 「a」or「da」or「dda」or「ddda」とか
- echo '0文字以上:' . preg_replace('/d*a/', 'z', $str) . "\n";
- //結果:0文字以上:zbczbcz
- // 「da」or「dda」or「ddda」とか
- echo '1文字以上:' . preg_replace('/d+a/', 'z', $str) . "\n";
- //結果:1文字以上:abczbcz
サンプル
複数の半角スペースを一つにする
$repStr = preg_replace('/ * /', " ", $Str);
など特殊文字(エンティティ)とかを全角スペースに変換
など特殊文字(エンティティ)とは、「[&][;]の間に英数字と記号」が含まれている。
ということで、まず「&」。
次に「英数字と記号」をマッチさせる。「[a-zA-Z0-9[:punct:]]」の中の「a-zA-Z0-9」が英数字。「[:punct:]」が記号。
英数字と記号が複数回表示されるってのが「.+」。最短一致させるので「?」。
最後に「;」が表示されるもの。
$str = “ recatnap ”;
$ort = preg_replace('/&[a-zA-Z0-9[:punct:]].+?;/', " ", $str);
// 最短一致での結果(?アリ):「 recatnap 」
$ort = preg_replace('/&[a-zA-Z0-9[:punct:]].+;/', " ", $str);
// 最長一致での結果(?ナシ):「 」
半角数字だけの場合、削除
$repStr = preg_replace('/^[0-9]+$/', "", $Str);
サンプルとかのまとめ:php 正規表現のサンプル