記事の内容
この記事では、PHPで文字列を検索する方法を説明します。
strpos, mb_strpos, stripos, strrpos, strripos, strstr, stristr, strpbrk, preg_matchについて見ていきます。
PHPのバージョンは、7系です。
strpos
文字列内の部分文字列が最初に現れる場所を見つけてくれる関数です。
戻り値で判定する場合は、必ず「===」を使うようにしましょう。
なぜならば、「==」による緩い比較だと、0がfalseだと判定されてしまうからです。
0番目に目的の文字列が見つかった場合、trueと判定して欲しいはずです。
<?php | |
# PHP_EOLは改行コードです | |
# strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int | |
# strpos ( 検索対象の文字列, 検索したい文字列, offset) : 文字列はintです | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
# 負のoffsetを指定すると、文字列の末尾からこの数だけ戻った場所から検索を開始します | |
$mystring = 'abc'; | |
$findme = 'a'; | |
$pos = strpos($mystring, $findme); | |
var_dump($pos); | |
// int(0) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abc' の中で見つかりました | |
echo PHP_EOL; | |
# 「==」で比較した場合は、$posが0の場合に思ったように動作しません | |
if ($pos == false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' は、文字列 'abc' の中で見つかりませんでした | |
echo PHP_EOL; | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
$mystring = 'abcabc'; | |
$findme = 'a'; | |
$offset = 1; | |
$pos = strpos($mystring, $findme, $offset); | |
var_dump($pos); | |
// int(3) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abcabc' の中で見つかりました | |
echo PHP_EOL; |
mb_strpos
文字列内の部分文字列が最初に現れる場所を見つけてくれる関数です。
mb_は、「マルチバイト」の略です。
マルチバイト文字(ひらがな、漢字)などにも対応しています。
strpos関数を拡張したものです。
マルチバイト文字をstrposで検索した場合の結果と合わせて確認して下さい。
<?php | |
# PHP_EOLは改行コードです | |
# mb_strpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding() ]] ) : int | |
# mb_strpos ( 検索対象の文字列, 検索したい文字列, offset, 文字コード) : 文字列はintです | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
# 負のoffsetを指定すると、文字列の末尾からこの数だけ戻った場所から検索を開始します | |
$mystring = 'こんにちは'; | |
$findme = 'こ'; | |
$pos = mb_strpos($mystring, $findme); | |
var_dump($pos); | |
// int(0) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'こ' が文字列 'こんにちは' の中で見つかりました | |
echo PHP_EOL; | |
# 「==」で比較した場合は、$posが0の場合に思ったように動作しません。 | |
if ($pos == false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'こ' は、文字列 'こんにちは' の中で見つかりませんでした | |
echo PHP_EOL; | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
$mystring = 'こんにちは、にわとりさん'; | |
$findme = 'に'; | |
$offset = 1; | |
$pos = mb_strpos($mystring, $findme, $offset); | |
var_dump($pos); | |
// int(2) | |
$offset = 3; | |
$pos = mb_strpos($mystring, $findme, $offset); | |
var_dump($pos); | |
// int(6) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'に' が文字列 'こんにちは、にわとりさん' の中で見つかりました | |
echo PHP_EOL; | |
# strposで、マルチバイト文字を試してみます | |
# $posに入っている数字が、12になっているので誤りです | |
$mystring = 'こんにちは'; | |
$findme = 'は'; | |
$pos = strpos($mystring, $findme); | |
var_dump($pos); | |
// int(12) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
echo PHP_EOL; | |
// 文字列 'は' が文字列 'こんにちは' の中で見つかりました |
stripos
文字列内の部分文字列が最初に現れる場所を見つけてくれる関数です。
strposとは異なり、striposは大文字小文字を区別しません。
<?php | |
# PHP_EOLは改行コードです | |
# strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int | |
# strpos ( 検索対象の文字列, 検索したい文字列, offset) : 文字列はintです | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
# 負のoffsetを指定すると、文字列の末尾からこの数だけ戻った場所から検索を開始します | |
$mystring = 'abc'; | |
$findme = 'a'; | |
$pos = strpos($mystring, $findme); | |
var_dump($pos); | |
// int(0) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abc' の中で見つかりました | |
echo PHP_EOL; | |
# 「==」で比較した場合は、$posが0の場合に思ったように動作しません | |
if ($pos == false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' は、文字列 'abc' の中で見つかりませんでした | |
echo PHP_EOL; | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
$mystring = 'abcabc'; | |
$findme = 'a'; | |
$offset = 1; | |
$pos = strpos($mystring, $findme, $offset); | |
var_dump($pos); | |
// int(3) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abcabc' の中で見つかりました | |
echo PHP_EOL; |
strrpos
文字列中に、ある部分文字列が最後に現れる場所を探します。
<?php | |
# PHP_EOLは改行コードです | |
# strrpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int | |
# strrpos ( 検索対象の文字列, 検索したい文字列, offset) : 文字列はintです | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
# 負のoffsetを指定すると、文字列の末尾からこの数だけ戻った場所から検索を開始します | |
$mystring = 'abca'; | |
$findme = 'a'; | |
$pos = strrpos($mystring, $findme); | |
var_dump($pos); | |
// int(3) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abca' の中で見つかりました | |
echo PHP_EOL; | |
# 「==」で比較した場合は、$posが0の場合に思ったように動作しません。 | |
if ($pos == false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abca' の中で見つかりました | |
echo PHP_EOL; | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
$mystring = 'abcabcabc'; | |
$findme = 'a'; | |
$offset = 2; | |
$pos = strrpos($mystring, $findme, $offset); | |
var_dump($pos); | |
// int(6) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abcabc' の中で見つかりました | |
echo PHP_EOL; |
strripos
大文字小文字を区別せずに、文字列が最後に現れた位置を探します。
strrposと異なり、strriposは大文字小文字を区別しません。
<?php | |
# PHP_EOLは改行コードです | |
# strripos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int | |
# strripos ( 検索対象の文字列, 検索したい文字列, offset) : 文字列はintです | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
# 負のoffsetを指定すると、文字列の末尾からこの数だけ戻った場所から検索を開始します | |
$mystring = 'abcA'; | |
$findme = 'a'; | |
$pos = strripos($mystring, $findme); | |
var_dump($pos); | |
// int(3) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abcA' の中で見つかりました | |
echo PHP_EOL; | |
# 「==」で比較した場合は、$posが0の場合に思ったように動作しません。 | |
if ($pos == false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abcA' の中で見つかりました | |
echo PHP_EOL; | |
# offsetを指定すると、文字列内での検索開始位置がその位置になります | |
$mystring = 'abcabcAbc'; | |
$findme = 'a'; | |
$offset = 2; | |
$pos = strripos($mystring, $findme, $offset); | |
var_dump($pos); | |
// int(6) | |
if ($pos === false) { | |
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした"; | |
} else { | |
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました"; | |
} | |
// 文字列 'a' が文字列 'abcabcAbc' の中で見つかりました | |
echo PHP_EOL; |
strstr
文字列が最初に現れる場所を含めて、そこから文字列の終わりまでを返します。
<?php | |
# PHP_EOLは改行コードです | |
# strstr ( string $haystack , mixed $needle [, bool $before_needle = FALSE ] ) : string | |
# strstr ( 対象文字列, 探したい文字列) : 戻り値はstring | |
$email = 'name@example.com'; | |
$domain = strstr($email, '@'); | |
echo $domain, PHP_EOL; | |
// @example.com | |
$text = strstr($email, 'a'); | |
echo $text, PHP_EOL; | |
// ame@example.com | |
$text = strstr($email, 'A'); | |
echo $text, PHP_EOL; | |
// 何も表示されません |
stristr
文字列が最初に現れる場所を含めて、そこから文字列の終わりまでを返します。
大文字と小文字を区別しません。
<?php | |
# PHP_EOLは改行コードです | |
# stristr ( string $haystack , mixed $needle [, bool $before_needle = FALSE ] ) : string | |
# stristr ( 対象文字列, 探したい文字列) : 戻り値はstring | |
$email = 'name@example.com'; | |
$domain = stristr($email, '@'); | |
echo $domain, PHP_EOL; | |
// @example.com | |
$text = stristr($email, 'a'); | |
echo $text, PHP_EOL; | |
// ame@example.com | |
$text = stristr($email, 'A'); | |
echo $text, PHP_EOL; | |
// ame@example.com |
strpbrk
文字列の中から任意の文字を探します。
見つかった文字から始まる文字列、あるいは見つからなかった場合に FALSE を返します。
<?php | |
# PHP_EOLは改行コードです | |
# strpbrk ( string $haystack , string $char_list ) : string | |
# strpbrk ( 対象文字列, 探したい文字列) | |
# 見つかった文字から始まる文字列、あるいは見つからなかった場合に FALSE を返します。 | |
$text = 'Hello, Sum. This is a simple text.'; | |
echo strpbrk($text, 'mi'), PHP_EOL; | |
// m. This is a simple text. | |
echo strpbrk($text, 'S'), PHP_EOL; | |
// Sum. This is a simple text. | |
echo strpbrk($text, 's'), PHP_EOL; | |
// s is a simple text. |
preg_match
正規表現によるマッチングを行います。
<?php | |
# PHP_EOLは改行コードです | |
# 正規表現によるマッチングを行います | |
# preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int | |
# preg_match ( 正規表現, 対象文字列, マッチした文字列) : 戻り値はintです | |
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) { | |
echo "A match was found.", PHP_EOL; | |
} else { | |
echo "A match was not found.", PHP_EOL; | |
} | |
# A match was found. | |
if (preg_match("/php/i", "PHP is the web scripting language of choice.", $match)) { | |
echo "A match was found.", PHP_EOL; | |
} else { | |
echo "A match was not found.", PHP_EOL; | |
} | |
# A match was found. | |
var_dump($match); | |
// array(1) { | |
// [0]=> | |
// string(3) "PHP" | |
// } |