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

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

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

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

2908閲覧

現在のURLのルートパスを取得したい

meli

総合スコア312

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/09/23 12:39

編集2020/09/23 12:55

お世話になっております。

現在環境が3つあるのですが、各環境のルートパスを取得したいです。

開発環境1が https://test.jp/test/index.html
開発環境2が https://test.jp/test2/index.html
客用環境が https://kokyaku.net/index.html

階層が複数あるため、以下の方法ですと2階層目以下がカレントディレクトリの取得になってしまいます。

js

1var $dir = location.href.split("/"); 2var $dir2 = $dir[$dir.length -2];

やりたいことは、ルートパス+colorとして、色違いの色のページを見せたいです。
https://test.jp/test/index.htmlなら
https://test.jp/test/color/index.html

https://kokyaku.net/path2/path2.htmlのならば
https://kokyaku.net/color/path2/path2.html
という感じです。

現在は以下の形で運用していますが、3環境で動かしたいとのことです。

js

1var page_path = location.href; 2const replaced = page_path.replace('test/', 'test/color/');

ご教示いただければ幸いです。

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

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

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

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

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

otn

2020/09/23 12:55

どういうパスがあり得るのか?単に一番下の階層を落とせば良いのか?何かtestという文字列で判断しないといけないのかなどが分かるように書いてください。
meli

2020/09/23 13:03 編集

ありがとうございます。 kokyaku.net/をkokyaku.net/color/にreplaceしたく、 ルート以下のディレクトリは「abc」「def」の二つで、color以下にも「abc」「def」があります。 分かり辛くて申し訳ございません。
hentaiman

2020/09/23 23:59

色分けだけが目的ならURL変えない方がよくないですか URL分けたいなら仕方ないけど
meli

2020/09/24 04:11

ありがとうございます。 URLを分けて中身も多少変わるので、URLの変更は仕方ないかなと思っております。
guest

回答3

0

補足の内容はよく分かりませんが、
https://test.jp/test/ https://test.jp/test2/ https://kokyaku.net/ を列挙して残せば良いのでは?

JavaScript

1const page_path = location.href; 2const reg = new RegExp("(https://test.jp/test/|https://test.jp/test2/|https://kokyaku.net/).*"); 3const replaced = page_path.replace(reg,"$1");

投稿2020/09/23 13:19

otn

総合スコア85901

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

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

meli

2020/09/24 04:11

ご回答ありがとうございます。 やはりRegExpを使う方法が一般的なのですね…勉強になります。 ありがとうございます。
guest

0

ルート以下のディレクトリは「abc」「def」の二つで、color以下にも「abc」「def」があります。

この abc と def は各サイト共通で、必ずこの二つなんですよね?
つまり、こういう話ではないですか?

https://test.jp/test/abc/https://test.jp/test/color/abc/
https://test.jp/test/def/https://test.jp/test/color/def/

https://test.jp/test2/abc/https://test.jp/test2/color/abc/
https://test.jp/test2/def/https://test.jp/test2/color/def/

https://kokyaku.net/abc/https://kokyaku.net/color/abc/
https://kokyaku.net/def/https://kokyaku.net/color/def/

ならば、ルートを見つけるのではなく、/abc/ と /def/ を /color/abc/ と /color/def/ に変換すれば良いと思います。

ただし、これが単なるリンクならそのように置換すれば終わりですが、location.href ということは、実際にそこにアクセスした場合に置換ということですね?
その場合、置換後の https://test.jp/test/color/abc/ を更に置換して https://test.jp/test/color/color/abc/ にしてしまう可能性があるので、そのようなことの無いよう、/color/ がある場合を除かなければなりません。

これは次のような正規表現で置換できます。

url.href.replace(/(.*)(?<!/color)(/(abc|def)(/.*|$))/, "$1/color$2")

次のコードでテストケースを増やして確かめてください。

JavaScript

1const testStrings = [ 2 "https://test.jp/test/abc", 3 "https://test.jp/test/color/abc/", 4 "https://test.jp/test/def/", 5 "https://test.jp/test/color/def/", 6 "https://test.jp/test2/abc/", 7 "https://test.jp/test2/color/abc/", 8 "https://test.jp/test2/def/", 9 "https://test.jp/test2/color/def/", 10 "https://kokyaku.net/abc/", 11 "https://kokyaku.net/color/abc/", 12 "https://kokyaku.net/def/", 13 "https://kokyaku.net/color/def/", 14 15 "https://kokyaku.net/abc/abc", 16 "https://kokyaku.net/def/abc", 17 "https://kokyaku.net/abc.def/", 18] 19for (const url of testStrings) { 20 console.log(`\n${url}\n↓`); 21 console.log(url.replace(/(.*?)(?<!/color)(/(abc|def)(/.*|$))/, "$1/color$2")); 22} 23

実行結果は次のようになります。

https://test.jp/test/abc ↓ https://test.jp/test/color/abc https://test.jp/test/color/abc/ ↓ https://test.jp/test/color/abc/ https://test.jp/test/def/ ↓ https://test.jp/test/color/def/ https://test.jp/test/color/def/ ↓ https://test.jp/test/color/def/ https://test.jp/test2/abc/ ↓ https://test.jp/test2/color/abc/ https://test.jp/test2/color/abc/ ↓ https://test.jp/test2/color/abc/ https://test.jp/test2/def/ ↓ https://test.jp/test2/color/def/ https://test.jp/test2/color/def/ ↓ https://test.jp/test2/color/def/ https://kokyaku.net/abc/ ↓ https://kokyaku.net/color/abc/ https://kokyaku.net/color/abc/ ↓ https://kokyaku.net/color/abc/ https://kokyaku.net/def/ ↓ https://kokyaku.net/color/def/ https://kokyaku.net/color/def/ ↓ https://kokyaku.net/color/def/ https://kokyaku.net/abc/abc ↓ https://kokyaku.net/color/abc/abc https://kokyaku.net/def/abc ↓ https://kokyaku.net/color/def/abc https://kokyaku.net/abc.def/ ↓ https://kokyaku.net/abc.def/

追記

abc も def も無いケースがあるということなので、やはりルートを指定する必要があります。次のコードではルートを配列に入れてそれを使います。

JavaScript

1const testStrings = [ 2 "https://test.jp/test/abc", 3 "https://test.jp/test/color/abc/", 4 "https://test.jp/test/def/", 5 "https://test.jp/test/color/def/", 6 "https://test.jp/test2/abc/", 7 "https://test.jp/test2/color/abc/", 8 "https://test.jp/test2/def/", 9 "https://test.jp/test2/color/def/", 10 "https://kokyaku.net/abc/", 11 "https://kokyaku.net/color/abc/", 12 "https://kokyaku.net/def/", 13 "https://kokyaku.net/color/def/", 14 15 "https://kokyaku.net/abc/abc", 16 "https://kokyaku.net/def/abc", 17 "https://kokyaku.net/abc.def/", 18 "https://kokyaku.net/index.html" 19] 20 21// ルート指定 22const roots = [ 23 "https://test.jp/test/", 24 "https://test.jp/test2/", 25 "https://kokyaku.net/" 26]; 27 28// 正規表現をエスケープする 29const escapeRegularExpression = re => { 30 return re.replace(/[\^$*+?.(){[|]/g, a => `\${a}`); 31}; 32 33const insertColor = source => { 34 const rootRe = roots 35 .map(a => escapeRegularExpression(a)) 36 .join("|"); 37 const re = new RegExp(`^(${rootRe})(.*)`); 38 return source.indexOf("/color/") == -1 39 ? source.replace(re, "$1color/$2") 40 : source; 41}; 42 43for (const url of testStrings) { 44 console.log(insertColor(url)); 45}

投稿2020/09/23 22:32

編集2020/09/24 04:52
Zuishin

総合スコア28669

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

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

meli

2020/09/24 04:07 編集

ご回答ありがとうございます。 こちら試してみたのですが、ルート直下のものがcolorに変換されません。 var page_url = location.href; const replaced = page_url.replace(/(.*?)(?<!/color)(/(abc|def)(/.*|$))/, "$1/color$2"); ↑をlogで出すと、現在のURLがそのまま表示されます。
Zuishin

2020/09/24 04:07

その時の page_url はどうなっていますか?
meli

2020/09/24 04:08

replacedと一緒で、現在のURLそのままです。
Zuishin

2020/09/24 04:11

page_url の中身を書いてください。
guest

0

ベストアンサー

前質問

前質問の回答をそのまま使えると思いますが、pathnameを覚えていますか。

URL#hostname

前提条件を下記として、

環境URLルートディレクトリ
開発環境1https://test.jp/test//test/
開発環境2https://test.jp/test2//test2/
客用環境https://kokyaku.net//

hostnameの値に応じて、消費するディレクトリ数を可変して下さい。

JavaScript

1function toColorPathname (urlString) { 2 const url = new URL(urlString); 3 const map = new Map([['test.jp', 1],['kokyaku.net',0]]); 4 5 return url.pathname.replace(new RegExp('^(/(?:[^/]*/){' + map.get(url.hostname) + '})'), '$1color/'); 6} 7 8console.log(toColorPathname('https://test.jp/test/foo/index.html')); // "/test/color/foo/index.html" 9console.log(toColorPathname('https://test.jp/test2/bar/index.html')); // "/test2/color/bar/index.html" 10console.log(toColorPathname('https://kokyaku.net/piyo/index.html')); // "/color/piyo/index.html"

new URL()

前章では、hostname(絶対パス)を得る形式でしたが、URLのインスタンスを持つ形式にしておくと、今後、URL関連の操作が必要になった際に拡張が楽になります。

JavaScript

1'use strict'; 2function toColorUrl (urlString) { 3 const url = new URL(urlString); 4 const map = new Map([['test.jp', 1],['kokyaku.net',0]]); 5 6 url.pathname = url.pathname.replace(new RegExp('^(/(?:[^/]*/){' + map.get(url.hostname) + '})'), '$1color/'); 7 return url; 8} 9 10const srcList = ['https://test.jp/test/foo/index.html', 'https://test.jp/test2/bar/index.html', 'https://kokyaku.net/piyo/index.html']; 11const colorList = ['https://test.jp/test/color/foo/index.html', 'https://test.jp/test2/color/bar/index.html', 'https://kokyaku.net/color/piyo/index.html']; 12const resultList = []; 13 14for (let src of srcList) { 15 resultList.push(toColorUrl(src)); 16} 17 18console.log(JSON.stringify(colorList)); // ["https://test.jp/test/color/foo/index.html","https://test.jp/test2/color/bar/index.html","https://kokyaku.net/color/piyo/index.html"] 19console.log(JSON.stringify(resultList)); // ["https://test.jp/test/color/foo/index.html","https://test.jp/test2/color/bar/index.html","https://kokyaku.net/color/piyo/index.html"] 20console.assert(JSON.stringify(colorList) === JSON.stringify(resultList));

Re: meli さん

投稿2020/09/23 12:43

編集2020/09/24 01:01
think49

総合スコア18189

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

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

meli

2020/09/23 12:46

今回もすみません、、、 pathname を使ってルートパスを取得する方法がわからずです。 複数階層でのルートパスの取得はどうすればよいのでしょうか…;;
think49

2020/09/23 12:48 編集

削除
think49

2020/09/23 12:50

ルートパスとは 開発環境1が /test/ 開発環境1が /test2/ 客用環境が / を指していますか。
think49

2020/09/23 12:50

開発環境1が2つありますね…。
meli

2020/09/23 12:52

そうです!書き方がおかしくてすみません! ルートディレクトリですかね、、? 開発環境2に修正しました、すみません。
think49

2020/09/23 13:10

ルートディレクトリは / ただ一つと思いますが、一応、その表現で回答しました。
think49

2020/09/23 13:11

Adobeは「サイトルート」という言葉を発明しているようですね。 (一般呼称ではありませんが)
think49

2020/09/24 01:06 編集

親記事に追記しました。 前質問を踏まえると、今後、URL関連の操作が増えてきそうなので、「元URL」と「/color/ URL」をそれぞれURLのインスタンスとして保持しておき、必要に応じて操作すると良いかもしれません。
meli

2020/09/24 04:10

ご丁寧に解説までありがとうございます…! インスタンスの保持も考慮した方がよいですね。 試してみます、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問