【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です。
$txt ='さんぷる<span>サンプル</span>さんぷる';
$txt = mb_substr($txt, ($i_tg=(mb_strpos($txt,'<!--')+6)), (mb_strpos($txt,'-->'))-$i_tg);
echo$txt;
ぱっと分かる場合はばっちり理解できているので、この記事で得るものはありません。
私はここでつまづいてしまったのですが、答えは以下のような構文でOKです。
$txt ='さんぷる<span>サンプル</span>さんぷる';
$txt = mb_substr($txt, ($i_tg=(mb_strpos($txt,'<span>'))), (mb_strpos($txt,'</span>'))-$i_tg+7);
echo$txt;
ここからは、理解を深めるために、基本的な構文の構造を見ていくことにします。
特定の文字列の間の文字列を取得する
仕組み
最初のシンプルな構文に戻ってみましょう。
$txt ='さんぷる【サンプル】さんぷる';
$txt = mb_substr($txt, ($i_tg=(mb_strpos($txt,'【')+1)), (mb_strpos($txt,'】'))-$i_tg);
echo$txt;
$txt = 'さんぷる【サンプル】さんぷる';
$st = mb_strpos($txt,'【')+1;
$ed = mb_strpos($txt,'】')-$st;
$txt = mb_substr($txt, $st, $ed);
echo$txt;
mb_strpos
「mb_strpos」は、検索した文字列の「最初の出現位置」を取得します。
さっきの構文で見ていくと!
$st = mb_strpos($txt,'【')+1;
$ed = mb_strpos($txt,'】')-$st;
「$ed」に入っているのは、「検索文字(】)」が最初に出現する位置の「文字数」から、「$st」に入っている数を引いた数です。
mb_substr
「mb_substr」は、取得したい文字列の「開始位置」と「文字数」を指定して文字列を取得します。
「文字数」を指定しない場合は、「開始位置」以降の文字列を取得します。
$txt='abcdef';
echo mb_substr($txt,0);//結果:abcdef
echo mb_substr($txt,3);//結果:def
echo mb_substr($txt,1,2);//結果:bc
$txt = 'さんぷる【サンプル】さんぷる';
$st = mb_strpos($txt,'【')+1;
$ed = mb_strpos($txt,'】')-$st;
$txt = mb_substr($txt, $st, $ed);
echo$txt;
「$ed」で「$st」の数を引いているのは、「【」から「】」までの文字数を割り出すためです。
なので、もし仮に「さんぷる<span>サンプル</span>さんぷる」といった文字列から、「<span>」と「</span>」を含めた文字列を取得したい場合は、「$st」では「検索文字の次から」にする必要はないのでそのまま。
「$ed」では「検索文字を含んだ文字数」にしたいので、フックとなる文字列(</span>)の文字数を足しています。
$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開発を楽しみましょう!