@blog.justoneplanet.info

日々勉強

PHP Comparing, Searching and Replacing String(文字列の比較検索置換)

■文字列の比較

以下のようなコードを書いた場合、条件はtrueとなることに注意せねばならない。条件部分で$strがint型に自動で変換される為である。(808desu → 808)

<?php
$str = '808desu';
if($str == '808'){
    //code
}
?>

上述のような型の動的変換を予期した上でのコードは、自身の可読性を非常に下げる。従って、以下のようなコードを書くことをお勧めする。

<?php
$str = '808desu';
if($str === '808'){
    //code
}
?>

こういったコードにすれば、誰もが予期するように条件はfalseとなる。

文字列比較関数

以下のように、PHPには文字列を比較する関数も用意されている。

<?php
$str = '808desu';
if(strcmp($str, '808desu') === 0){
    //code
}
?>

strcmp関数は第一引数の文字列と第二引数の文字列を比較し、等しいときは0、第一引数が第二引数よりも大きいときは差分を正の値で返し、逆のときは差分を負の値で返す。また、以下のように大文字と小文字を区別しないstrcasecmp、最初のn文字までを比較するstrncasecmp関数もある。

<?php
$str = '808desu';
if(strcasecmp($str, '808Desu') === 0){
    //code
}
?>
<?php
$str = '808desu';
if(strncasecmp($str, '808Desukedo', 7) === 0){
    //code
}
?>
各関数について
int strcmp(string $str1, string $str2)
$str1を$str2と比べたときに、小さかったら負の数、大きかったら正の数、等しいかったら0を返す。
int strcasecmp(string $str1, string $str2)
大文字と小文字を区別しない。
int strncasecmp(strng $str1, string $str2, int $length)
はじめの$lengthだけ比較対象とする。但し、$lengthよりも一方が短い場合は、その文字数に合わせる。

正直なところ、暗記するコストの方が高くつくこの手の関数の有用性は理解に苦しむ。まぁそれがPHPの良いところでもあるのかもしれない。

■単純な文字列の検索

文字列の位置情報

PHPには以下のように、文字列の位置を返すstrpos関数がある。この関数は対象文字列に検索文字列が見つからなかったとき、falseを返す。従って条件文では、0が戻ることを考慮し以下のようにしなければならない。

<?php
$haystack = 'Mike's car';
$needle = 'Mike';
if(strpos($haystack, $needle) !== false){
    //code
}
?>

また以下のように、strpos関数は第三引数にオフセット値を指定できる。

<?php
$haystack = 'Mike's car. Mike's bike';
$needle = 'Mike';
print(strpos($haystack, $needle));//0
print(strpos($haystack, $needle, 1));//12
?>

strpos関数には大文字と小文字を区別しないstripos関数がある。

文字列の位置と部分文字列

文字列内から検索文字列以降を得たい場合は以下のように、strstr関数を使用する。但し、単純な文字列検索の場合は、より高速に動作するstrpos関数を使用するべきである。

<?php
$haystack = 'This is Mike's car';
$needle = 'Mike';
print(strstr($haystack, $needle));//Mike's car
?>

strstr関数には大文字と小文字を区別しないstristr関数がある。

関数によって「case」が付くものと「i」が付くものがあるが、これはPHPの統一性に欠ける面だと個人的には思う。

文字列のマスキング処理

以下のようにstrspn関数は、文字列の最初からマスキングし、一致文字列の長さを返す。ホワイトリスト方式である。また、ブラックリスト方式の関数としてstrcspn関数がある。

<?php
$str = '13927abccdestt';
$allowed_characters = '123456789';
print(strspn($str, $allowed_characters));//5
?>

以下のようにstrspn関数は、第三引数に対象文字列のオフセット値、第四引数に対象文字列の長さを指定できる。

<?php
echo strspn("foo", "o", 1, 2); // 2
?>

個人的には、この関数を使ったことはない。

各関数について
int strpos(string $str, string $needle)
文字列$strの中で$needleが最初に見つかる位置を返す。但し、見つからなかった場合は「false」を返す。
string strstr(string $str, string $needle)
文字列$strの中で$needleが最初に見つかる位置を含めた残りの文字列を返す。
int strspn(string $str, string $mask[, int $start[, int $length]])
文字列の先頭から何文字目までが$maskの条件を満たしているかを返す。第三引数にはオフセット値、第四引数には対象文字列の長さを指定できる。

■文字列の置換

文字列による検索と置換

以下のようにstr_replace関数を使って、検索文字列に一致したすべての文字列を置換する。

<?php
$search = 'John';
$replace = 'Nick';
$str = 'Hello, John!';
$str = str_replace($search, $replace, $str);
print($str);//Hello, Nick!
?>

また以下のように、置換対象の個数を知ることもできる。

<?php
$search = 'John';
$replace = 'Nick';
$str = 'Hello, John!';
$str = str_replace($search, $replace, $str, $counter);
print($counter);//1
?>

大文字と小文字を区別しないようにするには、str_ireplace関数を使用する。

部分指定による検索と置換

以下のようにsubstr_replace関数を使用する。第一引数は対象文字列、第二引数は置換文字列、第三引数はオフセット値、第四引数は置換される文字列の長さ。第四引数を指定しなかった場合は、オフセット値から最後までが置換対象となる。

<?php
$str = 'sample@test.com';
$replace = 'Nick';
$str = substr_replace($str, $replace, 0, 6);
print($str);//Nick@test.com
?>

以上を踏まえると以下のような使用例が考えられる。

<?php
$email = 'mike@sample.com';
$user = substr_replace($email, '', strpos($email, '@'));
print($user)//mike;
?>
各関数について
string str_replace(mixed $search, mixed $replace, mixed $subject[, int &$count])
対象文字列から検索文字列を全て置換文字列に変換します。
string str_ireplace(mixed $search, mixed $replace, mixed $subject[, int &$count])
大文字と小文字を区別しないstr_replace関数。
mixed substr_replace(mixed $str, string $replace, int $start[, int $length])
$start番目から$length分の文字列を$replaceに変換する。

■文字列の抽出

以下のようにsubstr関数を使用すると、文字列から一部分を抽出できる。

<?php
$str = 'She sells sea shells on the sea shore.';
print(substr($str, 0, 3));//She
print(substr($str, 4, 5));//sells
print(substr($str, 21));//on the sea shore.
?>

また以下のように第二引数には負の値を指定することができる。その場合、オフセット値は後ろから数え、そこから正の方向に第三引数分抽出することになる。

<?php
$str = 'She sells sea shells on the sea shore.';
print(substr($str, -1, 1));//.
print(substr($str, -6, 5));//shore
?>

各関数について

string substr(string $str, int $start[, int $length])
文字列を$startの位置から$lengthバイト切り出す。$lengthに負の値を与えると、最後から数えて$length分だけ結果から切り落とされる。

■文字列の分解と結合

以下のようにexplode関数を用いて、文字列を任意の文字で分解することができる。

<?php
$str = 'John,Jack,Nick';
$names = explode(',', $str);
var_dump($names);
/*
array(3) {
  [0]=>
  string(4) "John"
  [1]=>
  string(4) "Jack"
  [2]=>
  string(4) "Nick"
}
*/
?>

また、以下のようにimplode関数を用いて、配列を任意の文字列で結合することができる。

<?php
$names = array('Nick', 'Mike', 'Fred');
$str = implode(',', $names);
var_dump($str);
/*
string(14) "Nick,Mike,Fred"
*/
?>

各関数について

array explode(string $separator, string $str)
文字列を$separatorで分割し配列にする。
string implode(string $separator, string $str)
配列を$separatorで結合し文字列を返す。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment