【PHP】理解を深める!
特定の文字列の間の文字列を取得するソース解説

2022-06-16
PHPでやりたい事を検索などで調べていると、たくさんの先人の方々の知恵を分けてもらう事ができますよね。

私もPHPを使い始めた頃から大いにお世話になっているのですが、なかにはイマイチ理解が及ばず、使いこなせない構文もあったりします。

ここでは、「特定の文字列の間の文字列を取得する」時に、思ったような挙動にならず改めて調べ直した事をまとめてみました。

基本的な部分ではありますが、同じように仕組みがよく分からなくて応用が効かない、といった時の一助になれば幸いです。

\項目をタップするとジャンプできます/

特定の文字列の間の文字列を取得する方法

「【」と「】」の間の文字列を取得する例で見てみましょう。

PHP

$txt ='さんぷる【サンプル】さんぷる';
$txt = mb_substr($txt, ($i_tg=(mb_strpos($txt,'【')+1)), (mb_strpos($txt,'】'))-$i_tg);
echo$txt;
この構文で書き出されるテキストは「サンプル」となります。

抽出開始と抽出終了のフックとなる文字列が同じ文字数の場合はシンプルですね。

ちなみに、「さんぷる<span>サンプル</span>さんぷる」といった文字列から「<span>」と「</span>」の間の文字列を取得したい場合は、検索文字列部分の「+1」の部分を「+6」に変える(文字数を指定する)だけでOKです。

PHP

$txt ='さんぷる<span>サンプル</span>さんぷる';
$txt = mb_substr($txt, ($i_tg=(mb_strpos($txt,'<!--')+6)), (mb_strpos($txt,'-->'))-$i_tg);
echo$txt;
ではもし仮に、「さんぷる<span>サンプル</span>さんぷる」といった文字列から 「<span>」と「</span>」を含めた文字列を取得したい場合では、どこを変更すれば良いのでしょうか?

ぱっと分かる場合はばっちり理解できているので、この記事で得るものはありません。

私はここでつまづいてしまったのですが、答えは以下のような構文でOKです。

PHP

$txt ='さんぷる<span>サンプル</span>さんぷる';
$txt = mb_substr($txt, ($i_tg=(mb_strpos($txt,'<span>'))), (mb_strpos($txt,'</span>'))-$i_tg+7);
echo$txt;
これで、取得されるテキストは「<span>サンプル</span>」となります。

ここからは、理解を深めるために、基本的な構文の構造を見ていくことにします。

特定の文字列の間の文字列を取得する
仕組み

最初のシンプルな構文に戻ってみましょう。

PHP

$txt ='さんぷる【サンプル】さんぷる';
$txt = mb_substr($txt, ($i_tg=(mb_strpos($txt,'【')+1)), (mb_strpos($txt,'】'))-$i_tg);
echo$txt;
上記の構文でやってることは、以下の内容と同じです。

PHP

$txt = 'さんぷる【サンプル】さんぷる';
$st = mb_strpos($txt,'【')+1;
$ed = mb_strpos($txt,'】')-$st;
$txt = mb_substr($txt, $st, $ed);
echo$txt;

mb_strpos

「mb_strpos」は、検索した文字列の「最初の出現位置」を取得します。

さっきの構文で見ていくと!

PHP

$st = mb_strpos($txt,'【')+1;
$ed = mb_strpos($txt,'】')-$st;
「$st」に入っているのは、「検索文字(【)」が最初に出現する位置の「文字数」に1を足した数です。

「$ed」に入っているのは、「検索文字(】)」が最初に出現する位置の「文字数」から、「$st」に入っている数を引いた数です。

mb_substr

「mb_substr」は、取得したい文字列の「開始位置」と「文字数」を指定して文字列を取得します。

「文字数」を指定しない場合は、「開始位置」以降の文字列を取得します。

PHP

$txt='abcdef';
echo mb_substr($txt,0);//結果:abcdef
echo mb_substr($txt,3);//結果:def
echo mb_substr($txt,1,2);//結果:bc
さっきの構文の例だと、「$st」で指定した「開始位置」から「$ed」で割り出した「文字数」を取得している事になります。

PHP

$txt = 'さんぷる【サンプル】さんぷる';
$st = mb_strpos($txt,'【')+1;
$ed = mb_strpos($txt,'】')-$st;
$txt = mb_substr($txt, $st, $ed);
echo$txt;
「$st」で1足しているのは、開始位置を「【」の次の文字からにするため。

「$ed」で「$st」の数を引いているのは、「【」から「】」までの文字数を割り出すためです。

なので、もし仮に「さんぷる<span>サンプル</span>さんぷる」といった文字列から、「<span>」と「</span>」を含めた文字列を取得したい場合は、「$st」では「検索文字の次から」にする必要はないのでそのまま。

「$ed」では「検索文字を含んだ文字数」にしたいので、フックとなる文字列(</span>)の文字数を足しています。

PHP

$txt ='さんぷる<span>サンプル</span>さんぷる';
$txt = mb_substr($txt, ($i_tg=(mb_strpos($txt,'<span>'))), (mb_strpos($txt,'</span>'))-$i_tg+7);
echo$txt;//結果:<span>サンプル</span>
というのが、今回見てきた「特定の文字列の間の文字列を取得する」構文の仕組みとなります。

特定の文字列の間の文字列を取得する
余談

「特定の文字列の間の文字列」を取得したい時、最初はなんとなく「文字列そのもの」をフックにしている感覚で、うまく理解できていませんでした。

こうして1つずつ構造を見てみることで、やっと「開始位置」と「文字数」を指定して取得している、という仕組みを実感することができました。

「文字列の取得」を自在に使いこなして、PHP開発を楽しみましょう!

SHARE

このサイトについて

「Web Work Plus」はWEB制作・ビジネスのちょい足し情報メデイアです。ちょっとしたハテナをプラスに変える役立つ備忘録を発信中!