[PHP]preg_replaceで正規表現を使った置換+後方参照のメモ

php メモ

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】

テキストエディタでも使えるよ

正規表現に対応しているテキストエディタなら使えるので、少し難しい置換もさくっとできちゃいます。
表現の仕方はPHPで使うのとだいたい一緒なので、活用すると便利。

参考(ありがとうございます):
正規表現サンプル集

記事が参考になったらぜひいいね!をお願いしますm(_ _)m
  • preg_replaceで置換したかったので、とてもわかりやすく助かりましたー

  • kogi

    ありがとうございます(^^お役に立てたみたいで嬉しいです。

  • soner_wave

    すいません、質問ですが
    title以降の属性(id=に限らず)あらゆる属性を削除して
    に置換したいのですがよい方法がありましたら
    大変お手数ですがご教授ください。

  • kogi

    どもも。

    $str = ‘タイトル’;
    $str = preg_replace(“/(?/”, “$1>”, $str);

    こんな感じでどうでしょう?

php, メモ」カテゴリの人気記事

アウトドア&フィッシング ナチュラム

こちらもどうぞ