回答編集履歴

2

補足

2019/03/01 01:44

投稿

otn
otn

スコア84622

test CHANGED
@@ -65,3 +65,9 @@
65
65
  beforeStr = beforeStr.replace(/\r\n|\n|\r/g, '<br>');
66
66
 
67
67
  ```
68
+
69
+ 質問文のコードのようにループで何回も置換せず、このように一回だけ置換すれば、
70
+
71
+ `<span><span>Cheese</span> Cake</span>`
72
+
73
+ みたいなことは起こりません。

1

追記

2019/03/01 01:44

投稿

otn
otn

スコア84622

test CHANGED
@@ -1,7 +1,67 @@
1
1
  `Cheese Cake`が`<span><span>Cheese</span> Cake</span>`になるので良ければ、
2
2
 
3
- ループの前で、`array1 = array1.sort(function(a,b){ return b.toString().length-a.toString().length;});`すればいいです。
3
+ ループの前で、`array1 = array1.sort((a,b)=>b.toString().length-a.toString().length);`すればいいです。
4
4
 
5
5
 
6
6
 
7
7
  あと、単語の前後に、単語境界指定を入れて`/\bwhite\b/g` とかにした方が良いかと思います。さらに、名詞は`/\bapples?\b/g`のように複数形も考慮した方が良いかも。
8
+
9
+
10
+
11
+ もう少し改善すると、複数形をさておくと、
12
+
13
+ ```JavaScript
14
+
15
+ let array1 = [
16
+
17
+ "white",
18
+
19
+ "apple",
20
+
21
+ "brown",
22
+
23
+ "tomato",
24
+
25
+ "cheese",
26
+
27
+ "Cheese",
28
+
29
+ "Cheese Inc\.",
30
+
31
+ /* 追加日 */
32
+
33
+ "Cheese Cake",
34
+
35
+ "blueberry",
36
+
37
+ "blueberry pie",
38
+
39
+ "brown 2",
40
+
41
+ "yellow",
42
+
43
+ "brown4",
44
+
45
+ /* 追加日 */
46
+
47
+ "cat",
48
+
49
+ "compact",
50
+
51
+ "water",
52
+
53
+ "water server",
54
+
55
+ "yellowR"
56
+
57
+ ]
58
+
59
+ let regstr = "\b"+array1.sort((a,b)=>b.length-a.length).join("\b|\b")+"\b";
60
+
61
+ let beforeStr = document.querySelector('#before').value;
62
+
63
+ beforeStr = beforeStr.replace(new RegExp(regstr), '<span>$&</span>');
64
+
65
+ beforeStr = beforeStr.replace(/\r\n|\n|\r/g, '<br>');
66
+
67
+ ```