質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

666閲覧

JavaScript 英文で文字列を見比べて変化がある単語をマークする

Rihael4

総合スコア18

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/07/07 04:26

英文の文章と文章を照らし合わせて、変化のあった単語をマークしたいです。
いろいろなパターンがあると思うので、まずは「書き換えられた単語」をマークするjsに挑戦しました。

文A
I wake up in 11 am
文B
I wake up at 11 am

この2つの文を照らし合わせると、文Aの"in"が文Bでは"at"に書き換えられています。
そこで、文Aの"in"を<span>で囲んでline-throughにし、文2の"at"のカラーを緑にする、というJSを作ります。

多分これはindexofやmatchを使えば実現できると思います。
文章をそれぞれ空白でsplitし、分割された単語たちを片方の分割される前の文章に検索かけていきます。検索されない単語が見つかれば<span>で囲み、文Aの単語ならばline-through、文Bの単語ならばcolor: green;、を付与すれば実現できるのではないかなと考えています。

文Aにはない単語を文B中に「増やした」場合にその単語をマークすることも、この方法で可能かなと思います。

しかし

文A
I wake up in 11 am and drink coffee at the kitchen
文B
I wake up at 11 am and drink coffee in the kitchen

この場合だと、at と in という単語はどちらの文章にも存在しているので、マークすることができないです。

何か良い方法がありましたら、教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/07/07 07:07

処理はなんとでもなるけど、ロジックが固まっていないので ブレが対応できません。 単語にわけて前から順に比較するとかですか? 順番がずれたらその単語以降全部違う判定されかねないですけど
guest

回答1

0

ベストアンサー

こんにちは

ご質問にあるような、2つの文字列の差分を得たいときに便利な jsdiff というライブラリがあります。現時点で、Starの数が4.9kと、それなりに評判もよいです。以下はこれを使った例です。

html

1<div id="before"></div> 2<div id="after"></div>

css

1.removed { 2 text-decoration-line: line-through; 3 text-decoration-color: red; 4 background-color: #feebee; 5} 6 7.added { 8 color: green; 9 background-color: #e3ffeb; 10}

javascript

1const oldStr = 'I wake up in 11 am and drink coffee at the kitchen'; 2const newStr = 'I wake up at 11 am and drink coffee in the kitchen'; 3const diff = Diff.diffChars(oldStr, newStr); 4 5const [beforeHtml, afterHtml] = diff.reduce(([before, after], { added, removed, value }) => { 6 if (removed) { 7 before += `<span class="removed">${value}</span>`; 8 } else if (added) { 9 after += `<span class="added">${value}</span>`; 10 } else { 11 before += value; 12 after += value; 13 } 14 return [before, after]; 15}, ['', '']); 16 17$('#before').append(beforeHtml); 18$('#after').append(afterHtml);

参考になれば幸いです。

投稿2020/07/07 07:17

jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Rihael4

2020/07/07 07:49

探していたのはまさにこれです!試してみます。ありがとうございます。
jun68ykt

2020/07/07 15:08

どういたしまして???? お試しいただいたうえで、解決できない点などあればお知らせください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問