【Laravel】Fluent文字列操作を試してみる! その一

どーも!たかぽんです!

今回はLaravel7に移行したことによって追加されたFluent文字列操作について調べてみます!

Fluent文字列操作って・・・?

さて、最近Laravel7に移行してからFluent文字列操作と言う機能が追加されたようですね。

簡単に言うと文字列の追加や削除、部分検索等、開発をしていく上で文字列をこう言う操作ができたら嬉しいなぁというのをメソッドとして使える機能です。

また、基本的にメソッドチェイン(メソッドを連ねて使用)することができるので、それも考慮すると大抵のことはこのlaravelのヘルパーメソッド群で実現可能です。

知っておくと便利そうなので、今回追加された分を簡単に確認しておこうと思います。

ただ...ちょっと長くなってしまうので、3つ程度の記事に分けて書きます。

では、やっていきましょう!

afterヘルパー

まずはafterです。

基本的な使い方は以下。

ofのに操作したい文字列を渡し、afterの中に適当な語句を入れることで、操作対象の中にその語句があれば、それ以降の文字列を返してくれます。

Str::of('This is my name')->after('This is');
// ' my name'

Str::of('This ismyname')->after('This is');
// 'myname'

Str::of('ここから先をコピペしてくださいhogehugahugo')->after('ここから先をコピペしてください');
// 'hogehugahugo'

Str::of('あいうえおかきくけこ')->after('さしすせそ');
// 'あいうえおかきくけこ'

使いようでは役に立ちそうな予感ですね!

似たようなパス名のファイルがたくさんあり、親ディレクトリまでは等しいけど、末端のファイル名だけ違うので取得したい!とかあれば使えそうですね...!

ただ、存在しない場合はそのままの全文が返る点は注意ですね。

afterLastヘルパー

こちらは先ほどのafterで、一致するものが複数ある場合、最後に現れた語句のそれ以降の文字列を返します。

Str::of('aiueoNOTOUTPUTaiueoOUTPUT')->afterLast('aiueo');
// 'OUTPUT'

Str::of('MyProject\App\Http\Controllers\Controller')->afterLast('\\');
// 'Controller'

Str::of('MyProject\App\Http\Controllers\Controller')->afterLast('ABC');
// 'MyProject\App\Http\Controllers\Controller'

さっきファイル名取得とか書いたけど、こっちでやったが良さそうですねw

エスケープしてバックスラッシュで指定してあげれば一番深いファイルの名前が取得できるわけです!

こちらも指定した値が存在しない場合は全文が返る点は注意です。

appendヘルパー

appendは文字列を後ろに追加することができるメソッドですね。

Str::of('MyProject\App\Http\Controllers\Controller')->append('.php');
// 'MyProject\App\Http\Controllers\Controller.php'

Str::of('MyProject\App\Http\Controllers\Controller')->append('.blade')->append('.php');
// 'MyProject\App\Http\Controllers\Controller.blade.php'

何か定型の文章を追加する時などはべんりそうですね!

asciiヘルパー

asciiメソッドは、文字列をアスキー値への変換を試みます。

とあるんですが・・・。

いまいちわかんないですね...w

印刷?表示?ができるように、問題のある文字があればいい感じに変えてくれている的な意味合いな気はしています...

Str::of('Ä')->ascii();
Str::of('Å')->ascii();
// 'A'

Str::of('Ü')->ascii();
// 'U'

Str::of('±')->ascii();
Str::of('╦')->ascii();
// ''

以前C言語で足算をして大文字から小文字へ変えたりしてたのを思い出しました...。

basenameヘルパー

これはとっても便利メソッドですね...!

パスなどから、一番末端の名称部分を返してくれます。

また、引数には除外したい拡張子が指定できるっぽいです。

ただし、拡張子としてはほとんど扱いが一緒の"JPG, jpg"ですが、同一のものとは判定されないようですね。

また、バックスラッシュ"\"はだめなので気をつけてください。

Str::of('MyProject/App/Http/Controllers/Controller')->basename();
// 'Controller'

Str::of('MyProject\App\Http\Controllers\Controller')->basename();
// 'MyProject\App\Http\Controllers\Controller'

Str::of('MyProject/App/Http/Controllers/Controller.php')->basename();
// 'Controller.php'

Str::of('MyProject/App/Http/Controllers/Controller.php')->basename('.php');
// 'Controller'

Str::of('MyProject/App/Http/Controllers/Controller.JPG')->basename('.jpg');
// 'Controller.JPG'

beforeヘルパー

afterの前バージョンですね。

一致した語句よりてまえの文字を返してくれます。

Str::of('This is my name')->before('my name');
// 'This is'

Str::of('Thisismyname')->before('myname');
// 'Thisis'

Str::of('hogehugahugoここから前をコピペしてください')->before('ここから前をコピペしてください');
// 'hogehugahugo'

Str::of('あいうえおかきくけこ')->before('さしすせそ');
// 'あいうえおかきくけこ'

beforeLastヘルパー

こちらも同じくafterLastの逆ですね。

Str::of('aiueoOUTPUTaiueoNOTOUTPUT')->beforeLast('aiueo');
// 'aiueoOUTPUT'

Str::of('MyProject\App\Http\Controllers\Controller')->beforeLast('\\');
// 'MyProject\App\Http\Controllers'

Str::of('MyProject\App\Http\Controllers\Controller')->beforeLast('ABC');
// 'MyProject\App\Http\Controllers\Controller'

camelヘルパー

次はcamelです。

このメソッドはスネークケースの文字列をローワーキャメルケースに変えてくれます。

Str::of('foo_bar')->camel();
// 'fooBar'

Str::of('logincontroller')->camel();
// 'logincontroller'

こう言うちょっとしたメソッドが思ったよりも便利なんですよね・・・!

containsヘルパー

次はcontainsです。

containsは文字列に指定した文字列が含まれるかどうかの真偽値を返します。

また、複数の文字列を指定して、そのいずれかの文字列が含まれているかを確認もできるようですね。

Str::of('This is a pen')->contains('pen');
// true

Str::of('This is apen')->contains('pen');
// true

Str::of('This is apen.')->contains('pen');
// true

Str::of('This is a pen.')->contains('is a pen');
// true

Str::of('This is a pen.')->contains('apple');
// false

Str::of('This is a pen.')->contains('this');
// false

Str::of('ABCDEFG')->contains(['a','B','c']);
// true (Bが含まれているから)

Str::of('ABCDEFG')->contains(['a','b','c']);
// false ('a','b','c'のいずれも含まれないから)

大文字小文字もちゃんと区別されます。

containsAllヘルパー

contains Allは全ての文字列を含んでいるかどうかを確認できます。

先ほど配列で渡すと”いずれかの文字列”を含んでいるのが確認できました。

それに対して全て含んでいるのも確認したいよねってことですね。

Str::of('ABCDEFG')->containsAll(['A','B','C']);
// true

Str::of('ABCDEFG')->containsAll(['AB','CD','EF']);
// true

Str::of('ABCDEFG')->containsAll(['ABC','CDE','EFG']);
// true

Str::of('ABCDEFG')->containsAll(['a','B','c']);
// false (Bはあるけど、'a','c'が無いから)

Str::of('ABCDEFG')->containsAll(['a','b','c']);
// false ('a','b','c'のいずれも含まれないから)

dirnameヘルパー

次は親ディレクトリの名前を取得するのに便利なや〜つですね!

引数は自ディレクトリorファイル含め、いくつ分削除するのかを指定できます。

Str::of('/foo/bar/baz')->dirname();
// '/foo/bar' (bazの親ディレクトリ名)

Str::of('five/four/three/two/one')->dirname();
// 'five/four/three/two'

Str::of('five/four/three/two/one')->dirname(0);
// PHP Warning:  dirname(): Invalid argument, levels must be >= 1

Str::of('five/four/three/two/one')->dirname(1);
// 'five/four/three/two'

Str::of('five/four/three/two/one')->dirname(2);
//'five/four/three'

Str::of('five/four/three/two/one')->dirname(5);
// '.'

Str::of('/five/four/three/two/one')->dirname(5);
// '/'

メソッドの性質上、dirnameへ引数がない場合と、引数"1"の場合の挙動が同じになっています。

さらに、"0"が引数に与えられるとwarningになるため、0は与えないようにすべきでしょう。

endsWithヘルパー

endsWithは最後の文字が指定した文字列で終わっているかの真偽値を返します。

Str::of('This is an apple.')->endsWith('.'); 
// true

Str::of('This is an apple')->endsWith('.');
// false

Str::of('image/image01.jpg')->endsWith('.jpg');
// true

Str::of('This is a pen')->endsWith(['pen', 'apple']);
// true ('pen'で終わっているので)

Str::of('This is a eraser')->endsWith(['pen', 'apple']);
// false ('pen'でも'apple'でも終わっていないので)

exactlyヘルパー

次はexactlyです。

これは、完全に文字列が一致しているかどうかを判定します。

よく口語でもexactly!(その通り!)とか言われたりしますね。

Str::of('Laravel')->exactly('Laravel');
// true

Str::of('Laravel')->exactly('laravel');
// false

explodeヘルパー

指定した文字列で元の文字列を区切り、結果をコレクションとして返します。

Str::of('This is a pen')->explode(' ');
// collect(['This', 'is', 'a', 'pen'])

Str::of('one/two/three/four/five')->explode('/');
// collect(['one', 'two', 'three', 'four', 'five'])

Str::of('one and two and three')->explode(' and ');
// collect(['one', 'two', 'three'])

よくファイルパスをいい感じにばらけさせて使ったりするので、そんな時便利そう...!

finishヘルパー

finishは指定した文字列で対象の文字列が終わっていなければ、その指定した文字列を付与します。

appendに条件がついた的な感じですね。

Str::of('Http/Controller')->finish('/');
// 'Http/Controller/' ('/'で終わっていないので'/'を末尾に付与した文字列を返す)

Str::of('Http/Controller/')->finish('/');
// 'Http/Controller/' ('/'で終わっているのでそのままの文字列を返す)

isヘルパー

isヘルパーは文字列が指定パターンに一致しているかどうかの真偽値を返します。

ワイルドカードも使用できるので、正規表現ほどは難しいですが、少し柔軟な文字列一致確認ができそうですね。

Str::of('foobar')->is('foo*');
// true

Str::of('foobar')->is('baz*');
// false

Str::of('foobar')->is('f*r');
// true

Str::of('foobar')->is('foo...');
// false

その二はこちらから...

長くなってしまうので、本記事は三つに分けています。

続きはこちらから...

おすすめの記事