[PHP]preg_replaceで正規表現を使った置換+後方参照のメモ
PHPでたーくさんあるcsvデータを書き換えなきゃいけないことがあったので、正規表現で文字の置換をやってみました。
が、案外難しいというか、PHPも正規表現あんまりわかんなくて結構苦労したのでメモ。
PHPで正規表現で置換を行うときは
- preg_replace
- ereg_replace
のどちらかで行います。
違いは・・・
preg_replace・・・Perl互換の正規表現関数を使う
ereg_replace・・・POSIX拡張正規表現を使う
・・・だそうな。(手元のPHP辞書?による)
正直良くわかりませんorz
ネットで調べているとpreg_replaceの情報が多い印象だったので、自分はpreg_replaceを使うことに。
preg_replaceはこんな感じ↓に使います。(置換してそのまま表示する例)
echo preg_replace(“/検索する文字/”,”置換する文字”,”対象の文字列”);
検索する文字列を”/”で囲むのです。なので、検索する文字に”/”を副みたい場合は”\/”と記述します。
以下はサンプル文章が$strに入っているものとします。
$str = "サンプル文章";
あるタグの中身だけを置換する
元の文章:
この<strong>バナナ</strong>は食べてはいけません。でも<strong>りんご</strong>は食べてもいいです。
上のような文章で<strong>の中の文字を”じゃがいも”に変えたい場合。
echo preg_replace("/<strong>.*<\/strong>/","<strong>じゃがいも</strong>",$str);
この<strong>じゃがいも</strong>は食べてもいいです。
おおう?最初の<strong>から最後の</strong>までいってまう。
正規表現は指定がない場合は最長一致になるので、最後に出てくる</strong>までヒットするのでこうなる。
最短一致で検索するには↓のようにします。
echo preg_replace("/<strong>.*?<\/strong>/","<strong>じゃがいも</strong>",$str);
置換後:
この<strong>じゃがいも</strong>は食べてはいけません。でも<strong>じゃがいも</strong>は食べてもいいです。
「?」をつけることで最短一致になるー。
タグだけを変えたい場合
後方参照を使うことでタグの内容を残せます。
echo preg_replace("/<strong>(.+?)<\/strong>/","<i>$1</i>",$str);
置換後:
この<i>バナナ</i>は食べてはいけません。でも<i>りんご</i>は食べてもいいです。
()でくくった部分は置換文字で$1とか$2とか書くと出てきます。
カッコが複数ある場合は、1つ目が$1、2つ目が$2という感じ。
複数行でもらっくらく
元の文章:
<div class=”section”>
コザクラインコ(小桜インコ、学名:<i>Agapornis roseicollis</i>)とは<br />
オウム目インコ科ボタンインコ属の鳥である。種子食。
</div>
<div class=”data”>
体長は約15cm、体重40~60g程度。
</div>
<div class=”section”>
<i>アンゴラ共和国</i>には<br />
亜種のアカコザクラインコ(Agapornis roseicollis catumbella)が生息する。
</div>
という文章でclass=”section”のdivだけ全部消します。
echo preg_replace("/<div class=\"section\">.*?<\/div>/s","",$str);
置換後:
<div class=”data”>
体長は約15cm、体重40~60g程度。
</div>
/の後についている”s”はパターン修飾子で、sを付けると”.*”で改行を含む全ての文字列にヒットするようになります。
行頭とか行末の指定
行頭は”^”、行末は”$”で表します。
デフォルトではこの表現は使えないので、修飾子でmを付けて使わないとヒットしません。
echo preg_replace("/^<i>.*?<\/i>/m","<strong>$1</strong>",$str);
これで行頭にある<i>を<strong>に変えれます。
置換後:
<div class=”section”>
コザクラインコ(小桜インコ、学名:<i>Agapornis roseicollis</i>)とは<br />
オウム目インコ科ボタンインコ属の鳥である。種子食。
</div>
<div class=”data”>
体長は約15cm、体重40~60g程度。
</div>
<div class=”section”>
<strong>アンゴラ共和国</strong>には<br />
亜種のアカコザクラインコ(Agapornis roseicollis catumbella)が生息する。
</div>
逆に行頭でない<i>をという場合は・・・うおーわかんねー!
と思っていたらこちらの方が紹介されてました。うーん難しい。
テキストエディタでも使えるよ
正規表現に対応しているテキストエディタなら使えるので、少し難しい置換もさくっとできちゃいます。
表現の仕方はPHPで使うのとだいたい一緒なので、活用すると便利。
参考(ありがとうございます):
正規表現サンプル集