HubLで文字列内の単語の出現回数をカウントする
例えば「hogeふがピヨhogehogeふが」の文字列において、hogeが何回出て来るか?をカウントする方法です。自分の知る限りHubLにはこれを一発で処理できる関数やフィルタはないので、少し工夫することになります。
発想としては「hogeの度に何かができれば良さそう」なので、splitフィルタを使います。一旦シンプルな例でいくと、「ふがhogeピヨ」に対してsplitフィルタを使用した場合、次のようになりhogeの出現回数を取得できます。
{{ 'ふがhogeピヨ'|split('hoge')|length - 1 }} ↓ 1(hogeの出現回数)
分解して解説すると、まず 'ふがhogeピヨ'|split('hoge')
で ['ふが', 'ぴよ']
のリストができます。このリストのlengthから-1した値が、hogeの出現回数になります。
ただし厄介なのが最初の例で「hogeふがピヨhogehogeふが」に対し |split('hoge')
すると、得られるリストは [ふがピヨ, ふが]
になります。このリストのlength - 1は1なので、これはhogeの出現回数ではありません。要は行頭・行末の区切り文字や、連続する区切り文字があると期待通りの結果を得られないのです。
ではどうするかというと、先に区切り文字に何か適当な文字を付加しておきます。そのうえでsplitを行うと、期待通りの結果が得られます。
{{ 'hogeふがピヨhogehogeふが'|replace('hoge', '@hoge')|split('hoge')|length - 1 }} ↓ 3(hogeの出現回数)
そもそもHubLでこういう文字処理などしだすこと自体辛さがあるのですが、かといってしないと先に進めないこともありますので、ご参考までに。
ちなみに配列であれば、count関数が使え、「単に文字列中に特定の単語を含むかどうか」であれば、string_containingが使えます。