Kintarou'sBlog

プログラミング学習中。学習内容のアウトプットや読書で学んだことなど随時投稿!

【PHP】文字列を扱う関数例

こんにちは😊Kintarouです。

現在エンジニア転職を目指してTECH CAMPにてプログラミング学習中です👨‍🎓
夢はフリーランスエンジニアになって働く人が働きやすいシステムを作ること!
と、愛する妻と海外移住すること🗽

プログラミングや読んでいる本のことなど、ブログに書いていきます!
twitter : https://twitter.com/ryosuke_angry


本日も文字列を扱う関数をまとめます。 今回参考にさせて頂いたサイト様🙇‍♂️
dotinstall.com
www.php.net


文字列の字数を調べる

文字列の字数を確認する場合、strlenを使います。

<?php

$str = ' Teach me !!   ';

echo strlen($str) . PHP_EOL;

#=> 15

※この字数には空白や改行が含まれています。空白や改行を含めたくない場合、trimで除去してから調べましょう。
※日本語を扱う場合はマルチバイト対応の関数を使う必要があるのでmb_strlenとしましょう。

文字列の空白や改行を除去する

先ほどの例を使います。

<?php

$str = ' Teach me !!   ';
$str = trim($str);

echo strlen($str) . PHP_EOL;

#=> 11

※前後の空白が除去されて11になりました。(文字に含まれている空白は除去されません)

trimは空白以外も指定することで除去することは出来ます。ただし、あくまで前後からの除去なので除去しない文字に囲まれている文字は除去できません。

<?php

$str = ' Teach me !!   ';
$str = trim($str);

echo $str . PHP_EOL;

#=>Teach me !!

$str = trim($str, "eT");
echo $str . PHP_EOL;

#=>ach me !!

※指定の文字は順不動なので"eT"としても最初のTeは除去されます。が、me !! 部分のeは !!に阻まれているので除去されずに残っています。

特定の文字の位置を検索する

strposを使うことで、特定の文字が頭から何番目にあるかを調べられます。

<?php

$str = 'Teach me !!';

echo strpos($str, 'h') . PHP_EOL;

#=>4

※添字0からカウントされるのでT(0)e(1)a(2)c(3)h(4)で4番目にhがある事がわかります。
※頭から最初にヒットした文字列の位置を返します。2つ目以降は返しません。
※strposも日本語を扱う場合はmb_strposとしましょう。

文字を置換する

str_replaceを使って文字を置換する事ができます。

<?php

$str = 'Teach me !!';

$str = str_replace('ach', 'll', $str);
echo $str . PHP_EOL;

#=>Tell me !!

※引数に書く順番に注意しましょう。('置換したい文字','置換後の文字',対象の文字列)と、渡す文字列は最後にきます。 ※こちらは当てはまる文字全てを置換します。

文字列の特定の箇所まで切り出す

特定の箇所まで切り出したい場合はsubstrを使います。
仮に商品の購入日と商品名、金額が書いてあるデータがそれぞれ*と/で区切られたフォーマットがある場合に、購入日、商品名、金額で切り出してみます。

<?php

#購入情報です。日付の後に*、商品名の後に/が入っています。
$transaction = '20201015*Apple/300';

#strposでそれぞれの字数を取得します。
$date_line = strpos($transaction, '*');
$product_line = strpos($transaction, '/');

#substrを使って$transactionの何番目から何文字分を取得するかを指定しています。
#終わりまでを取得する場合、何文字分というのは省略出来ます。
#*や/は結果に含めないのでそれぞれの字数を+1で調整しています。
$date = substr($transaction, 0, $date_line);
$product = substr($transaction, $date_line + 1, $product_line - ($date_line + 1));
$plice = substr($transaction, $product_line + 1);

#それぞれ出力します。
echo $date . PHP_EOL;
echo $product . PHP_EOL;
echo $plice . PHP_EOL;

#=>20201015
#=>Apple
#=>300

文字列の特定の箇所を置換する

substr_replaceで特定の箇所を置換できます。 先ほどのコードの商品名'Apple'を'Pineapple'に置換します。

<?php

$transaction = '20201015*Apple/300';

$date_line = strpos($transaction, '*');
$product_line = strpos($transaction, '/');

#追加分(ここから)

#substr_replaceで$transactionの*から/の中に'Pineapple'を置換しています。
$transaction = substr_replace($transaction, 'Pineapple', $date_line + 1, $product_line - ($date_line + 1));

#/の位置を再取得しています。
$product_line = strpos($transaction, '/');


#追加分(ここまで)

$date = substr($transaction, 0, $date_line);
$product = substr($transaction, $date_line + 1, $product_line - ($date_line + 1));
$plice = substr($transaction, $product_line + 1);

echo $date . PHP_EOL;
echo $product . PHP_EOL;
echo $plice . PHP_EOL;

#=>20201015
#=>Pineapple
#=>300

特定パターンの文字列を検索、置換する

先ほどは文字列の中の特定の文字位置を割り出して検索(切り出し)、置換を行いましたが、正規表現などを使って検索など行う事もできます。
正規表現に関しては過去記事をご参照ください🙇‍♂️
ryosuke-toyama.hatenablog.com
検索にはpreg_match_allを使います。

<?php
$input = 'Call us at 03-3001-1256 or 03-3015-3222';
$pattern = '/\d{2}-\d{4}-\d{4}/';


#$inputの中で正規表現$patternに当てはまる文字列を$matchesに配列として格納します。
#配列に、最初にマッチした文字列だけ格納したい場合はpreg_matchとすればOKです。
preg_match_all($pattern, $input, $matches);

print_r($matches);

#=>Array
#=>(
#=>    [0] => Array
#=>        (
#=>            [0] => 03-3001-1256
#=>            [1] => 03-3015-3222
#=>        )
#=>
#=>)

上記の例で、今度は置換してみます。

<?php

$input = 'Call us at 03-3001-1256 or 03-3015-3222';
$pattern = '/\d{2}-\d{4}-\d{4}/';

#$inputの中で$patternに当てはまる文字列を'**-****-****'に置換します。
$input = preg_replace($pattern, '**-****-****', $input);

echo $input . PHP_EOL;

#=>Call us at **-****-**** or **-****-****

基本substr_replaceするよりこちらの方が良さそうな気がします😉

文字列から配列、配列から文字列に変換する

文字列から配列にはexplode、配列から文字列にはimplodeを使います。
年、月、日が入った配列を-区切りの文字列にし、再度配列に戻します。

<?php

$d = [2020, 10, 15];
print_r($d);

#=>Array
#=>(
#=>    [0] => 2020
#=>    [1] => 10
#=>    [2] => 15
#=>)

#implodeで配列の要素ごとを-で区切った文字列に変換します。
$d = implode('-', $d);
echo $d . PHP_EOL;

#=>2020-10-15

#再度explodeで-ごとの要素を格納した配列に変換します。
$d = explode('-', $d);
print_r($d);

#=>Array
#=>(
#=>    [0] => 2020
#=>    [1] => 10
#=>    [2] => 15
#=>)

以上、どなたかの参考になれば幸いです😊