D.C. Re:tune~ダ・カーポ~ リチューン 限定版<さくらEdition> -Switch 【Amazon.co.jp限定】 オリジナルPC&スマホ壁紙 配信 限定版特典・ヴァイスシュヴァルツPRカード(4種) 同梱
商品ページAmazon
非収益広告(手動登録)
サクラ度:○(問題なし)
フェリエ ES-WR51-P ピンク調 女性用 顔・うなじ・腕・脚用 ムダ毛処理 コンパクト 軽量 電動シェーバー ボディシェーバー
商品ページAmazon
収益広告(自動登録)
サクラ度:△(要確認)
【2025冬新登場】Tibnozt 電気ブラシ ems 美顔器 リフトブラシ 頭皮ブラシ 電動 EMS RF EP 3D振動 2色LED マイナスイオン 大容量液体ケース 美容液と併用 スポイト付 髪 頭筋 表情筋 美容家電 Type-C充電式 クリ
商品ページAmazon
収益広告(自動登録)
サクラ度:△(要確認)
HECOJOY 布団乾燥機 ダニ退治 【業界初・オゾン脱臭】 ふとん乾燥機 コンパクト パワフル「1台多役」布団あたため 衣類乾燥 靴乾燥 布団かんそう 3段階温度・30-180分タイマー設定 軽量 収納便利 省エネ設計 アロマ対応 湿気対策 梅雨対
商品ページAmazon
収益広告(自動登録)
サクラ度:△(要確認)
記事の概要
htmlタグ混在のテキストをhtmlタグとプレーンテキストで分けるJavaScriptコード
作成日:2025-06-20
最終更新日:2025-06-20
記事の文字数:2162
本記事のトピック
- 概要
- JavaScriptコード
htmlタグ混在のテキストをhtmlタグとプレーンテキストで分けるJavaScriptコード
概要
「よくある質問は<a href="/">こ<span>ち</span>ら</a>です」 というようなhtmlタグ混在のテキストを、htmlタグとプレーンテキストごとに分けるJavaScriptコードです。
「よくある質問は<a href="/">こ<span>ち</span>ら</a>です」 であれば、以下のような出力になります。
const htmlText = よくある質問は<a href="/">こ<span>ち</span>ら</a>です;
const separatedHtmlText = separateHtmlText(htmlText);
console.log(separatedHtmlText);
//[
// {
// "htmlText": "よくある質問は",
// "type": "text",
// "tag": null
// }, {
// "htmlText": "<a href=\"/\">",
// "type": "tagOpen",
// "tag": "a"
// }, {
// "htmlText": "こ",
// "type": "text",
// "tag": null
// }, {
// "htmlText": "<span>",
// "type": "tagOpen",
// "tag": "span"
// }, {
// "htmlText": "ち",
// "type": "text",
// "tag": null
// }, {
// "htmlText": "</span>",
// "type": "tagClose",
// "tag": "span"
// }, {
// "htmlText": "ら",
// "type": "text",
// "tag": null
// }, {
// "htmlText": "</a>",
// "type": "tagClose",
// "tag": "a"
// }, {
// "htmlText": "です",
// "type": "text",
// "tag": null
// }
//]
JavaScriptコード
実際のJavaScriptコードは以下です。
function separateHtmlText(htmlText){
const htmlTextElm = new DOMParser().parseFromString(htmlText, 'text/html').body;
const results = separateNode(htmlTextElm);
return(results);
}
function separateNode(nodes){
const results = [];
for (const child of nodes.childNodes) {
if (child.nodeType === Node.TEXT_NODE) {
// プレーンテキスト
results.push(createSeparateObj(child.textContent, 'text'));
} else if (child.nodeType === Node.ELEMENT_NODE) {
// タグ開始
const tagName = child.tagName.toLowerCase();
const tagAttrs = [...child.attributes].map(attr => `${attr.name}="${attr.value}"`).join(' ');
const tagOpen = `<${tagName}${tagAttrs ? ' ' + tagAttrs : ''}>`;
const tagClose = `${child.tagName.toLowerCase()}>`;
results.push(createSeparateObj(tagOpen, 'tagOpen', tagName));
const r = separateNode(child);
results.push(...r);
results.push(createSeparateObj(tagClose, 'tagClose', tagName));
}
}
return results;
function createSeparateObj(htmlText, type, tag = null){
const result = {
text: htmlText,
type: type,
tag: tag,
};
return result;
}
}
上にも書いてありますが、基本的な使い方は以下です。
const htmlText = よくある質問は<a href="/">こ<span>ち</span>ら</a>です;
const separatedHtmlText = separateHtmlText(htmlText);
文字列ではなく、html要素自体を渡したい場合は以下で動くはずです。
const targetElm = document.getElementById('targetElmId')
const separatedHtmlText = separateNode(targetElm);
コメントログ
コメント投稿
管理人ツイート
【Amazon.co.jp限定】ひげそり 電動シェーバー 小型 深剃り 2モード調整 電気シェーバーメンズ 顔 往復式 シェーバー メンズ コンパクト IPX7防水 お風呂剃り対応 乾湿両用 髭剃り 電動 日本製3枚刃 18000RPM 高速回転 L
商品ページAmazon
収益広告(自動登録)
サクラ度:△(要確認)
FURUMO FZ-Y80MF 加湿フィルター 空気清浄機用交換フィルター KC-G50 KC-E50 KC-F50 KC-J50 KC-50TH4 KC-G40 KC-H50 加湿空気清浄機用 FZ-Y80MF(枠付き)互換品 1枚入り
商品ページAmazon
収益広告(自動登録)
サクラ度:△(要確認)
CFBF FZ-Y80MF(枠付き)加湿フィルター & FZ-AG01K1 イオンカートリッジ 加湿空気清浄機 交換用フィルター 互換品 2点セット
商品ページAmazon
収益広告(自動登録)
サクラ度:△(要確認)
ドライヤー【2026先行公開・お客様の声で進化モデル】 ヘアドライヤー 大風量 速乾 折り畳み 3段階風量 57℃恒温 高濃度マイナスイオン 『着脱式バックカバー&風速アップ 』髪質改善 静電気防止 ノズル・収納ホルダー付 旅行用 サテンブルー
商品ページAmazon
収益広告(自動登録)
サクラ度:△(要確認)