2010年に書いた記事を再編集して公開しました。
PHPで検索対象の文字列に、特定の文字列が含まれるかどうかなどをチェックするための書き方を紹介します。
「strstr」と「stristr」
まずはPHPマニュアルで「strstr」を確認してみましょう。
続いてこちらは「stristr」になります。
書き方はどちらもこのようになります。
strstr( A, B )
stristr( A, B )
文字列Aにおいて文字列Bが最初に見つかった位置から最後までの文字列を返す。
strstr()は文字列の大文字小文字を区別し、stristr()は文字列の大文字小文字を区別しません。
↑パッと見分かりづらいんですけど、関数名に「i」が入っている場合と入っていない場合で、挙動が違ってくるので注意しましょう!
<!--?php
$url = 'http://example.com/shop/item/3';
if (strstr($url, '/shop/item')) {
echo "URLに「/shop/item」が含まれています。";
} else {
echo "URLに「/shop/item」が含まれていません。";
}
echo "<br>";
var_dump(strstr($url, '/shop/item'));
</code></pre>
<p><strong>$_SERVER["REQUEST_URI"]</strong> でドメイン名以降のURL文字列を取得することが可能です。</p>
<h3>「strstr」関数のサンプル実行結果</h3>
<div class="dark-box">
URLに「/shop/item」が含まれています。<br ?-->
string(12) "/shop/item/3"
この関数は、見つかった文字列部分Bから最後までを結果として返すので、
echo strstr($url, '/shop/item');
とすると、「/shop/item/3」が表示されます。
「/shop/item」だけではなく、一致した文字列以降が返却されることに注意しましょうね。
「strpos」
strpos( A, B )
文字列Aの中で、Bが最初に現れる位置を探す。
<!--?php
$url = 'http://example.com/shop/item/3';
if (strpos($url, '/shop/item') !== false) {
echo "URLに「/shop/item」が含まれています。";
} else {
echo "URLに「/shop/item」が含まれていません。";
}
echo "<br>";
$str = '進撃の巨人';
var_dump(strpos($str, '進撃'));
echo "<br>";
if(strpos($str, '進撃') !== false) {
echo '駆逐してやる!';
}
</code></pre>
<h3>「strpos」関数のサンプル実行結果</h3>
<div class="dark-box">
URLに「/shop/item」が含まれています。<br ?-->
int(0)
駆逐してやる!
strposは該当する文字列が見つからなかった場合にfalseを返すのですが、先頭に該当する文字列があった場合に0を返すので注意しましょう。
型までチェックする必要があるため、判定には「=== false」もしくは「!== false」を使いましょう。
先頭一致の場合に判定できないので、trueでの判定は使わないでください。
「preg_match」
reg_match( A, B )
文字列Bから正規表現パターンAにより、文字列のマッチングを行う。
<!--?php
$string = "PHPは便利だ!";
if (preg_match("/PHP/", $string)) {
echo "「PHP」が含まれています。";
} else {
echo "「PHP」が含まれていません。";
}
</code></pre>
<h3>「preg_match」関数のサンプル実行結果1</h3>
<div class="dark-box">
「PHP」が含まれています。</div>
<p><span class="c-bold">preg_match関数だと正規表現が使える</span>ので、例えば特定の文字列から開始するかどうかといった確認(先頭一致)も「<strong>^</strong>」といった記号を使うことで可能です。</p>
<pre class="language-php line-numbers"><code><?php
$string = "PHPをそんなにディスらないで。";
if (preg_match("/^PHP/", $string)) {
echo "検索文字列の先頭は「PHP」です。";
} else {
echo "検索文字列の先頭は「PHP」ではありません。";
}
</code></pre>
<h3>「preg_match」関数のサンプル実行結果2</h3>
<div class="dark-box">
検索文字列の先頭は「PHP」です。</div>
<p>※正規表現パターンAを「<strong>/^[0-9]+$/</strong>」とすれば文字列Bが全て半角数字かどうか調べるといった使い方も可能です。</p>
<p>正規表現が使えると便利!</p>
<div class="box4-green">特定の文字列が他の文字列内に含まれているかどうかを調べるためだけに「preg_match」関数を使うのは避けたいところ。「strpos」関数、次いで「strstr」関数を使うほうが速い。</div>
<h2>注意事項</h2>
<p><span class="c-bold">preg_match関数は上記の「strstr/stristr」、「strpos」関数よりも低速でメモリ消費が多いので注意しましょう。</span></p>
<p>実行速度が速い順に、</p>
<div class="primary-box">
<ol>
<li>strpos</li>
<li>strstr/stristr</li>
<li>preg_match</li>
</ol>
</div>
<p>となります。</p>
<p>できるだけ高速に処理を行いたい場合は<span class="c-bold">「strpos」関数がおすすめ</span>です。<br ?-->
以上、「PHPで文字列の一致や、文字列を含むかどうかを判定」する方法でした!