PHPには最初から組み込み関数が用意されていて、開発効率やコードの品質向上に直結、自分で一から処理を作らなくて済みます。また、標準関数を使うことで処理が簡潔になり、プロジェクトでは他の人が呼んでもこのプログラムで何をしているのかがすぐに伝わります。PHPの開発に携わる場合、関数を知っているか知っていないかでコードへの処理能力が大きく変わると思います。私は常にPHPに携わるわけではなく、キャッチアップもかねてと関数を見直したりしますが、正直忘れているなーこんな関数あったかーとまだまだだなと思う常日頃です。。自分のキャッチアップもかねて、PHPでよく利用されている文字列操作関数について下記に記載させていただきます。
文字列の長さを取得できる関数。strlen()はバイト数で数えるので、日本語や中国語などマルチバイト文字を扱う場合は、mb_strlen()で文字を正確にカウントできます。
$a = "こんにちは";
echo strlen($a); // → 15(1文字3バイト × 5文字 = 15文字)
echo mb_strlen($a); // → 5(5文字)
文字列の一部を切り出す関数。substr()はバイト数で数えるので、日本語や中国語などマルチバイト文字を扱う場合は、mb_substr()で文字を正確に切り出すことができます。
$a = "こんにちは";
echo substr($a, 0, 3); // エラー文字化けの可能性大
echo mb_substr($a, 0, 3); // → こんに(正しく動作)
■投稿の先頭50文字を表示
$title = mb_substr($a, 0, 50, 'UTF-8');
文字列の中で探す対象の文字列が含まれているかを調べる関数。strpos() はバイト単位なので、日本語なら mb_strpos() を使うことで絵文字を含む文字列でも正しく「文字の位置」を取得できます。
$a = "こんにちは、世界";
$b = mb_strpos($a, "世");
echo $b; // → 6(文字数の位置(0から始まる)が戻り値)/ 見つからない時はfalseが戻り値
■検索条件分岐
$a = "エラーメッセージがあります";
if (mb_strpos($a, "エラー") !== false) {
echo "エラーを検出しました";
}
文字列の中で探す対象の文字列が「最後に」出てくる位置を調べる関数。strrpos() はバイト単位で位置を返すので、日本語などマルチバイト文字にはmb_strrpos() を使います。
$a = "test@example.com";
$b = strrpos($a, "@");
echo $b; // → 9(@の位置(0から始まる)が戻り値)/ 見つからない時はfalseが戻り値)
■最後に出てきた区切り文字で分割
$path = "/user/data/files/image.jpg";
$lastSlash = mb_strrpos($path, "/");
$filename = mb_substr($path, $lastSlash + 1);
echo $filename; // → image.jpg
■メールアドレスからドメインを取り出し
$email = "user@example.com";
$atPos = strrpos($email, "@");
$domain = substr($email, $atPos + 1);
echo $domain; // → example.com
大文字小文字関係なく特定の文字列の位置を検索する関数。ただ、stripos() はバイト単位で動くので、日本語のようなマルチバイト文字列では不正確になることがありますので、stripos()ではなくなりますが、日本語での検索は、下記のようなmb_strposにて一工夫必要です。
$text = "こんにちは";
$keyword ="ちは";
$text = mb_convert_case($text, MB_CASE_LOWER, "UTF-8");
$keyword = mb_convert_case($keyword, MB_CASE_LOWER, "UTF-8");
if (mb_strpos($text, $keyword) !== false) {
echo "見つかりました";
}
文字列の中より空白や改行・指定文字を削除する関数。フォーム処理でよく利用されます。
$a = "こんにちは \n";
$b = trim($a);
echo $b; // → "こんにちは"
■任意の文字を削除
$a = "///こんにちは///";
$b = trim($a, "/");
echo $b; // → "こんにちは"
文字列の片側にある空白や改行・指定文字を削除する関数。
$a = " こんにちは";
echo ltrim($a); // → "こんにちは"(先頭のスペースが消える)
$b = "こんにちは ";
echo rtrim($a); // → "こんにちは"(末尾のスペースが消える)
■任意の文字を削除
$a = "///こんにちは///";
$b = ltrim($a, "/");
echo $b; // → "こんにちは///"
$c = rtrim($a, "/");
echo $c; // → "///こんにちは"
文字列の大文字・小文字の変換を行う関数。
$a = "Hello World!";
// 大文字に
echo strtoupper($a); // → "HELLO WORLD!"
// 小文字に
echo strtolower($a); // → "hello world!"
■メールアドレスの比較
$email1 = "User@Example.com";
$email2 = "user@example.com";
if (strtolower($email1) === strtolower($email2)) {
echo "同じメールアドレスです";
}
■大文字小文字を無視した検索
$keyword = strtolower("PHP");
$title = strtolower("Hello php!");
if (strpos($title, $keyword) !== false) {
echo "キーワードを含んでいます";
}
文字列の置換(文字の置き換え)関数。配列の値を置換することもできます。
$a = '<p>こんにちは。</p>';
$b = str_replace( 'こんにちは', 'こんばんわ', $a ); // 該当する文字列を置換
echo $b; // → <p>こんばんわ。</p>
■配列の中身を置き換え
$a = ["red apple", "green apple", "yellow apple"];
$b = str_replace("apple", "banana", $a);
print_r($b);
// → ["red banana", "green banana", "yellow banana"]
■配列と1つの文字列で置換
$a = '<p>今日はいい天気ですね。</p>';
$b = str_replace( array('は', 'ですね' ),'', $a ); // 該当する文字列を置換
echo $b; // → <p>今日いい天気。</p>
正規表現による文字列置換関数。
$a = "私のメールアドレスは、user@example.com で電話番号は、090-1234-5678です";
$b = preg_replace([
'/\b[\w._%+-]+@[\w.-]+\.[a-z]{2,}\b/i', // メールアドレス
'/\b\d{2,4}-\d{2,4}-\d{4}\b/' // 電話番号
], ['[email hidden]', '[phone hidden]'], $a);
echo $b;
// → 私のメールアドレスは、 [email hidden] で電話番号は、[phone hidden]です
文字列を指定した区切り文字で分割して配列にする関数。
$a = "user,user@example.com,090-1234-5678";
$b = explode(",", $a);
print_r($b);
// 出力:["user", "user@example.com", "090-1234-5678"]
■限定分割(3つ目以降をまとめる)
$a = "A,B,C,D";
$b = explode(",", $a, 3);
print_r($result);
// → ["A", "B", "C,D"]
explaode()とは逆に配列の要素を結合して、1つの文字列に変換する関数。(※join()も同じ関数)
複数の値をあらかじめ配列に格納しておき、implodeで「カンマ区切りの文字列」を作成すれば、すぐにCSV1行に相当するテキストになります。
$a = ["user", "user@example.com", "090-1234-5678"];
$b = implode(",", $a);
echo $b; // → "user, user@example.com, 090-1234-5678"
■複数の列名を指定してのSQL文への使用例
$a = ["name", "address", "job"];
$b = ["'山田'", "'東京'", "'PHPエンジニア'"];
$c = implode(", ", $a);
$d = implode(", ", $b);
// 完成形のINSERT文
$e = "INSERT INTO users (" . $c . ") VALUES (" . $d . ")";
echo $sql;
// INSERT INTO users (name, address, job) VALUES ('山田', '東京', 'PHPエンジニア')
この変数が文字列かどうかを判定する型チェック関数。戻り値は真偽値です。
is_string() が true になるものは、
・"abc"(普通の文字列)
・""(空文字列も文字列扱い)
・"123"(数字だけでもクォーテーションがあれば文字列)
falseになるものは下記になります。
・123(数値)
・true / false(真偽値)
・null
・array
・object
$a = "こんにちは";
$b = 123;
$c = null;
var_dump(is_string($a)); // → true
var_dump(is_string($b)); // → false
var_dump(is_string($c)); // → false
■値の型チェック
function inputText($input) {
if (is_string($input)) {
echo "文字列: $input";
} else {
echo "文字列ではありません";
}
}
■ユーザー入力検証
$name = $_POST['name'] ?? '';
// ちなみにこちらNull合体演算子
//式 (expr1) ?? (expr2) は、 expr1 が null である場合は expr2 と評価され、それ以外の場合は expr1 と評価
if (is_string($name) && trim($name) !== '') {
echo "名前入力OK";
} else {
echo "無効な名前です。";
}
文字列がすべて英字(A~Z, a~z)かどうかをチェックする関数。戻り値は真偽値です。ctype_alpha() は 大文字・小文字問わず英字を許容します。小文字だけチェックしたいときは ctype_lower()、大文字だけなら ctype_upper() を使います。
var_dump(ctype_alpha("Hello")); // → true
var_dump(ctype_alpha("Hello123")); // → false
var_dump(ctype_alpha("こんにちは")); // → false
var_dump(ctype_alpha("")); // → false
var_dump(ctype_alpha(123)); // 警告になる(整数だとダメ)
var_dump(ctype_alpha("123")); // OK(ただし false)
■ユーザー名など入力が英字だけかチェック
$username = $_POST['username'] ?? '';
if (ctype_alpha($username)) {
echo "英字のみのユーザー名です";
} else {
echo "ユーザー名は英字だけで入力してください。";
}
HTMLタグとして解釈される記号を安全な文字に変換する関数。XSS(クロスサイトスクリプティング)対策の必需品です。
$a = "<script>alert('XSS!');</script>";
$b = htmlspecialchars($a);
echo $b; // → <script>alert('XSS!');</script>
//これで悪意のある <script> タグが「ただの文字列」として表示される
■XSS対策での基本パターン
echo htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');
// ENT_QUOTES:シングルクォートも変換する(セキュリティ的におすすめ)
// UTF-8':文字コード指定(日本語対応など)
htmlspecialchars() や htmlentities() でエンコードされた文字列を元の文字に戻す関数。
※< → <、> → > に変換。
$a = "<strong>こんにちは</strong>";
echo html_entity_decode($a);
// → <strong>こんにちは</strong>
指定したフォーマットで文字列を作る関数。
フォーマット指定子一部
・%s(文字列) "こんにちは"
・%d(整数) 42
・%f(小数)(浮動小数点)) 3.14
・%02d(2桁表示(0埋め)) 01, 09
$name = "山田";
$age = 20;
$a = sprintf("名前:%s、年齢:%d", $name, $age);
echo $a;
// → 名前:山田、年齢:20
■不揃いなデータを統一
echo sprintf( '%05d', 11); // → 00011
echo sprintf( '%05d', 222); // → 00222
echo sprintf( '%05d', 33); // → 00033
echo sprintf( '%05d', 4); // → 00004
echo sprintf( '%05d', 5555); // → 05555
「3桁ごとにカンマが入る」「小数点の桁数をそろえたい」など数値を見やすく整形する関数。
echo number_format(1234567); // → "1,234,567"
echo number_format(1234.5, 2); // → "1,234.50"
echo "¥" . number_format(1000000); // → ¥1,000,000
■戻り値は 数値ではなく文字列なので、計算に使いたいときは数値に戻す
$formatted = number_format(1000); // "1,000" ← str
$formatted = str_replace(",", "", $formatted); // 1000 int
ハッシュ化関数。文字列を固定長の128ビットのハッシュ値(32文字の16進数)に変換。
$password = "mypassword";
$hash = md5($password);
echo $hash;
// → 5ebe2294ecd0e0f08eab7690d2a6ee69
md5() は今では セキュリティ的に脆弱なため、パスワードなどを安全に保存したい場合は、
password_hash() + password_verify() を使うとよいですね。
$password = "mypassword";
$hash = password_hash($password, PASSWORD_DEFAULT);
if (password_verify("mypassword", $hash)) {
echo "ログイン成功";
} else {
echo "パスワードが違います。";
}
いかがでしたでしょうか。今回は、PHPでよく利用されている文字列操作関数についてご紹介させていただきました。関数を使うことで、コードの再利用や関数を使って処理を分けることで長いプログラムをより効率よく記述することができます。みなさんもPHP標準関数をうまく使ってよいエンジニアライフを。
以上となります。できる限りわかりやすく伝えようとしても書くのは難しいです。
コードや記事の書き方について気になるところがあれば、アドバイスいただけると嬉しいです。
要件定義からブラッシュアップ/実装運用まで一貫して担当。また内部対策を中心に、GTM・GA4・Looker Studioと分析・改善案の策定も進めています。北緯43度マルチエンジニア