teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2020/09/24 04:52

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -111,4 +111,56 @@
111
111
  https://kokyaku.net/abc.def/
112
112
 
113
113
  https://kokyaku.net/abc.def/
114
+ ```
115
+
116
+ ### 追記
117
+
118
+ abc も def も無いケースがあるということなので、やはりルートを指定する必要があります。次のコードではルートを配列に入れてそれを使います。
119
+
120
+ ```JavaScript
121
+ const testStrings = [
122
+ "https://test.jp/test/abc",
123
+ "https://test.jp/test/color/abc/",
124
+ "https://test.jp/test/def/",
125
+ "https://test.jp/test/color/def/",
126
+ "https://test.jp/test2/abc/",
127
+ "https://test.jp/test2/color/abc/",
128
+ "https://test.jp/test2/def/",
129
+ "https://test.jp/test2/color/def/",
130
+ "https://kokyaku.net/abc/",
131
+ "https://kokyaku.net/color/abc/",
132
+ "https://kokyaku.net/def/",
133
+ "https://kokyaku.net/color/def/",
134
+
135
+ "https://kokyaku.net/abc/abc",
136
+ "https://kokyaku.net/def/abc",
137
+ "https://kokyaku.net/abc.def/",
138
+ "https://kokyaku.net/index.html"
139
+ ]
140
+
141
+ // ルート指定
142
+ const roots = [
143
+ "https://test.jp/test/",
144
+ "https://test.jp/test2/",
145
+ "https://kokyaku.net/"
146
+ ];
147
+
148
+ // 正規表現をエスケープする
149
+ const escapeRegularExpression = re => {
150
+ return re.replace(/[\^$*+?.(){[|]/g, a => `\${a}`);
151
+ };
152
+
153
+ const insertColor = source => {
154
+ const rootRe = roots
155
+ .map(a => escapeRegularExpression(a))
156
+ .join("|");
157
+ const re = new RegExp(`^(${rootRe})(.*)`);
158
+ return source.indexOf("/color/") == -1
159
+ ? source.replace(re, "$1color/$2")
160
+ : source;
161
+ };
162
+
163
+ for (const url of testStrings) {
164
+ console.log(insertColor(url));
165
+ }
114
166
  ```

1

修正

2020/09/24 04:52

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  ならば、ルートを見つけるのではなく、/abc/ と /def/ を /color/abc/ と /color/def/ に変換すれば良いと思います。
16
16
 
17
- ただし、これが単なるリンクならそのように置換すれば終わりですが、href ということは、実際にそこにアクセスした場合に置換ということですね?
17
+ ただし、これが単なるリンクならそのように置換すれば終わりですが、location.href ということは、実際にそこにアクセスした場合に置換ということですね?
18
18
  その場合、置換後の https://test.jp/test/color/abc/ を更に置換して https://test.jp/test/color/color/abc/ にしてしまう可能性があるので、そのようなことの無いよう、/color/ がある場合を除かなければなりません。
19
19
 
20
20
  これは次のような正規表現で置換できます。