こんにちは、Ryohei(@ityryohei)です!

本記事では、JavaScriptで文字列内のハッシュタグをリンクに自動変換する方法をご紹介しています。

JavaScriptで文字列内のハッシュタグをリンクに自動変換したいな。良い方法ないかな?

上記の疑問にお答えします。

では、解説していきます。

文字列内にハッシュタグを設置する

文字列内にハッシュタグを設置します。ハッシュタグは#から半角・全角スペースまでの文字列とします。

下記は有名なダミーテキスト(徒然草)の一部をハッシュタグに書き換えたものです。下記の文字列を取得し、次項でハッシュタグの部分をリンクに変換していきます。

HTML

<p class="js-text">つれづれなるまゝに、日暮らし、硯にむかひて、#心にうつり ゆくよしなし事を、#そこはかとなく 書きつくれば、あやしうこそものぐるほしけれ。</p>
<p class="js-text">#つれづれ なるまゝに、日暮らし、硯にむかひて、心にうつり#ゆくよし なし事を、そこはかとなく 書きつくれば、あやしうこそものぐるほしけれ。</p>
<p class="js-text">つれづれなるまゝに、#日暮らし 、硯にむかひて、心にうつり ゆくよしなし事を、そこはかとなく 書きつくれば、#あやしうこそ ものぐるほしけれ。</p>

文字列内のハッシュタグをリンクに変換する

前項で作成したHTMLから文字列を取得し、文字列内のハッシュタグをリンクに変換します。リンクに変換というのは、URLにするのではなく、ハッシュタグの文字列をa要素で囲うという意味合いとなります。

JavaScript

const setHashtagLink= (selector)=>{
    const elements = document.querySelectorAll(selector);
    elements.forEach(element =>{
        element.innerHTML = element.innerHTML.replace(/#(\S+)/g, '<a href="#$1">#$1</a>');
    });   
}
setHashtagLink('.js-text');

上記スクリプトの実行後のDOMは下記のように変化します。

HTML

<p class="js-text">つれづれなるまゝに、日暮らし、硯にむかひて、<a href="#心にうつり">#心にうつり</a> ゆくよしなし事を、<a href="#そこはかとなく">#そこはかとなく</a> 書きつくれば、あやしうこそものぐるほしけれ。</p>
<p class="js-text"><a href="#つれづれ">#つれづれ</a> なるまゝに、日暮らし、硯にむかひて、心にうつり<a href="#ゆくよし">#ゆくよし</a> なし事を、そこはかとなく 書きつくれば、あやしうこそものぐるほしけれ。</p>
<p class="js-text">つれづれなるまゝに、<a href="#日暮らし">#日暮らし</a> 、硯にむかひて、心にうつり ゆくよしなし事を、そこはかとなく 書きつくれば、<a href="#あやしうこそ">#あやしうこそ</a> ものぐるほしけれ。</p>

文字列内のハッシュタグがリンクに変換されていますね。これで本記事のゴールは達成です。

リンクに変換した要素を取得する

せっかくなので、文字列内のハッシュタグをリンクに変換した後、リンクに変換した全ハッシュタグを取得し、リスト化できるようにしたいと思います。

JavaScript

const getHashtagLink= (selector)=>{
    const elements = document.querySelectorAll(selector);
    return [...elements].map(
        element => [...element.querySelectorAll('a')]
    ).flatMap(a => a);
}
getHashtagLink('.js-text');

上記関数の実行結果をconsole.logで出力すると、下記結果が出力されます。

(6) [a, a, a, a, a, a]

上記をul要素等のリストに出力することで、指定した要素内で使用されているハッシュタグリストを表示することが可能となります。

最後に

本記事でしれっと使っていますが、Arrayに追加されたflatMapの使い心地がすばらしいです。mapの後にflatを実行しているだけですが、flatMapに置き換えることでソースがかなりすっきりすると思います。MDNのリンクを掲載しておきますので、皆さんも確認してみてくださいね。

参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap

以上、JavaScriptで文字列内のハッシュタグをリンクに自動変換する方法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。

JavaScriptを基礎からしっかりと学びたい方へ

下記の参考書がおすすめです。私がJavaScript入門時に購入した書籍で、基礎から応用まで多様なサンプルを用いて解説されています。ページ数は多いですが、内容が伴っているのですらすら読めます。腰を据えて学びたい方に最良の一冊となっています。