PHPの文字列の検索や分割、置換などの基本操作とエスケープ文字

PHPに限りませんが、文字列を定義し出力するだけでなく、検索や分割、置換などの操作をする場面がかなりたくさんあります。

文字列を定義して繋げたり出力するだけなら簡単ですが、検索や分割や置換は全て覚えるのは大変ですし僕も全部は覚えていません。

メモ書きみたいに残しておき、それを確認したり以前に書いたコードを見てコピーしてます。

この記事の内容はそのメモのように使えると思います。

文字列の定義

文字列はシングルコーテーションダブルコーテーションで囲んで定義します。

このような感じです。

文字列の長さを取得

文字列の長さは strlen() を使って取得します。

上の “abcdefg” は7文字なので 7 が返ってきます。

しかし、このように日本語で書くと 10 や 15 が返ってきます。

これは文字のバイト数を返すからです。

使う文字コードによるのですが、UTF-8 だと日本語は3バイト文字になるので 15 が返ってきます。

 

単純に文字数を取得する場合は mb_strlen() を使います。

これだと3バイト文字だろうが単純に文字数で返してくれます。

文字列の連結

文字の連結は . (ドット) を使います。

 

ダブルコーテーションの場合は文字列の中に変数を定義すると変数の中の文字列をそこに埋め込むことが出来ます。

だけど、例えば下のように書くとエラーになります。

これは、$str1の後ろにすぐ文字が続くためどこまでが変数名か分からない為です。

その場合は変数名を { } で囲むことで解決できます。

これで正常に出力されます。

文字列の置換

文字列の一部を置換する場合には、str_replace() を使います。

第一引数には置換前の文字列を入れる。

第二引数には置換後の文字列を入れる。

第三引数には置換対象の文字列を入れる。

これで、,(カンマ)が&になります。

不要な文字列の除去

“あいうえお,かきくけこ,さしすせそ” のカンマを取り除くには上のように str_replace() を使うと出来ます。

 

前後のスペースを取り除くには trim() もあります。

trim() は前後の半角スペースを取り除くことが出来ます。

スペースは何個あっても全て取り除いてくれますが、全角スペースは取り除いてくれません。

 

カンマやスペースを取り除くのは簡単ですが、HTMLタグを取り除く関数がPHPにはあります。

HTML禁止のフォームにHTMLタグが入力された場合などはこれでHTMLタグを取り除くことが出来ます。

ちなみに、HTMLタグに存在しなくてもHTMLっぽい感じだったら取り除いてしまいます。

$str2 は “あいうえお” になります。

文字列の検索

文字列の検索をするには strpos() という関数があります。

第一引数には検索される文字列が入ります。

第二引数には検索する文字列が入ります。

 

例えば、”こんにちは。山田さん。” という文字列の中に “山田” が含まれているかどうかを検索する場合は、

このように結果を得ます。

結果は、文字列が見つかった場合は、見つかった文字列の位置をバイト数で返します。

見つからなかった場合は boolean 型の false を返します。

 

見つかったか見つからなかったかの判定をする場合は以下のように書きます。

5行目で if ($result === false) { と書かれています。

これはもし検索した文字列が一番先頭に存在した場合(上の例だと「こんにちは」を検索した場合)には、結果は 0 が帰ってきます。

if ($result == false) { のように書くと、0 は false として扱われてしまうため見つかっても 見つかっていない ことになってしまいます。

イコールを三つ(===)書いて型まで判定し、false ならば検索しても見つからなかったと判定しましょう。

 

検索して見つかったときだけ処理したい場合は、 if ($result !== false) { と書くようにするかもしれません。

これも間違いではありませんが、NOTを多様するのは僕は控えています。

「え~それってなくなくない??」とか言われても「え?どっち?」ってなりますよね。

こういうちょっとした認識しにくいことがバグの元になります。

バグはある程度出してテストで潰し、プログラムの行数(ステップ数)あたりのバグ件数が何件以上が目標のようなテスト目標を定めるプロジェクトもあります。

ですが、やっぱり最初からバグが無いコードを書いたほうがよくないですか?笑

検索して見つかったときだけ処理したい場合は、 if ($result === false) { と書き、else のほうに処理を記述するほうがバグは減らせます。

文字列の切り取り

サブストリングというのは色んな言語で文字列の切り抜きに使われる名前です。

ただ若干使い方が違ったりするのでPHPの関数名とその使い方をご紹介します。

 

文字列の一部を抜き取る方法は、substr() か mb_substr() を使えば出来ます。

substr() は、バイト数を指定して文字列をどこからどこまで抜き取るか指定する関数です。

第一引数には、元になる文字列を入れ、第二引数には開始位置、第三引数は文字数(バイト数)を指定します。

こう書くと “にち” が返ってきます。

文字列は1文字1文字インデックスという番号が割り振られていて、1文字目は0で始まります。

0-2バイトが1文字目、3-5バイトが2文字目になるので6バイト目は日本語の3文字目になります。

そこから6バイト取得します。つまり2文字です。

 

半角アルファベットや半角は1バイト文字ですので、この関数を使ってもバイト数=文字数として扱えるので簡単です。

では2バイト文字や3バイト文字の文字数を指定する方法は?

それが、mb_substr() です。

使い方は substr() とほぼ同じですが、第二引数と第三引数がバイトではなくインデックスで指定します。

こう書くと、”ちは” が出力されます。

インデックスは0から始まり3は4文字目になるので”ち”になります。

そしてそこからインデックス2つ分なので単純に2文字返ってきます。

文字列の分割

文字列の分割は例えばカンマ区切りのデータなどに有効です。

例えば “あいうえお,かきくけこ,さしすせそ” のような文字列があり、あいうえお、かきくけこ、さしすせそをそれぞれ取り出して扱いたい場合があるとします。

このように explode() を使うと指定した文字列で分割して返すことが出来ます。

explode() の第一引数に区切り文字を入れ、第二引数に区切る対象の文字列を入れます。

配列を結合し文字列に

上で explode() を使い文字列を分割して配列にしましたが、逆に配列を文字列にする関数もあります。

それが implode() です。

implode() は、配列を連結して文字列にする関数です。

第一引数には、文字列に連結する際に間に挟む区切り文字を指定します。

第二引数は連結する配列を指定します。

これは配列をカンマ区切りにし、CSVっぽいデータを作成する例です。

連結した文字列 $str を出力すると “山田,太郎,27歳,東京都” になります。

エスケープ文字

文字列の定義はダブルコーテーションやシングルコーテーションを使います。

もしダブルコーテーションで定義した文字列の中にダブルコーテーションを使いたい場合はエスケープ文字を使わないと定義できません。

例えば上のようにHTMLタグの入った文字列を扱う場合、id名にダブルコーテーションが使われています。(id=”yourname”)

これだとどこで文字列が終了しているのか分かりません。

しかし、このように書けば問題なく文字列の中にダブルコーテーションを埋め込むことが出来ます。

このような文字をエスケープ文字と言います。

 

エスケープ文字には他によく使われるもので以下のようなものがあります。

エスケープ文字 意味 宣言 表示
\t タブ $str = “りんご\tみかん”; りんご(ここにタブ)みかん
\n 改行 $str = “りんご\nみかん”; りんご
みかん
\’ シングルコーテーション $str = ‘りんご\’みかん’; りんご’みかん
\” ダブルコーテーション $str = “りんご\”みかん”; りんご”みかん
\\ バックスラッシュ $str = “りんご\\みかん”; りんご\みかん

 

文字列内にダブルコーテーションを使いたい場合は、文字列の定義に使う外側をシングルにすればエスケープ文字を使わなくても大丈夫です。

このような感じですね。

 

逆にシングルコートの中にエスケープしたダブルコートを使ったり、ダブルコートの中にエスケープしたシングルコートを使うと \ も表示されてしまいます。

まとめ

文字列の操作に関してもたくさん種類があり覚えられないですよね。

僕は覚えていません(笑)

このページをブックマークに登録しておいて、いつもこのページを見ています。

是非ブックマークに登録して文字列操作に活用させてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA