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

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

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

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

jQuery

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

Q&A

解決済

2回答

2104閲覧

正規表現で連続したURLを検出したい

gasorin

総合スコア15

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2020/02/26 01:10

テキストからURLを抽出したいです。

strを与えたら

js

1str = 'あああhttps://example.com/xxxあああhttps://example.net/yyy/zzz';

以下がほしいという感じで挑戦しています。

js

1[ 2 'https://example.com/xxx', 3 'https://example.net/yyy/zzz' 4];

まずネットで以下の正規表現を見つけたのですが、

js

1const reg = /(https?:/((?!\Whttps?:)(/(\w|.)+))+/?)/g;

これではハイフンがあると途切れてしまいまして、

調べるとURL向けの [\x21-\x7e] という正規表現があったのでそれを使って下記のようにしてみたのですが、

js

1function spliturl(str){ 2 str = decodeURI(str); 3 const reg = /(https?:/((?!\Whttps?:)(/[\x21-\x7e]+))+/?)/g; 4 let matches = new Array(); 5 while ((match = reg.exec(str))!== null) { 6 matches.push(match[1]); 7 } 8 return matches; 9}

これですと、以下のstrのように連続したURLに対応できませんでした。

js

1str = 'あああhttps://example.com/xxxhttps://example.net/yyy/zzz';

そこでタイトルにあるように「連続したURLを検出したい」となりました。またその問題点がございましたら教えて頂けませんでしょうか。宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは

ご質問にある

修正前:

javascript

1const reg = /(https?:/((?!\Whttps?:)(/[\x21-\x7e]+))+/?)/g;

に含まれる [\x21-\x7e]+ の部分を ((?!https?:)[\x21-\x7e])+ にして、以下に修正するといかがでしょうか?

修正後:

javascript

1const reg = /(https?:/((?!\Whttps?:)(/((?!https?:)[\x21-\x7e])+))+/?)/g;

以下は、動作確認のため 8個のテストケースで試したものです。

考慮されていないテストケースがあり、それだと意図した結果にならなければ、コメントからお知らせ頂ければと思います。(あるいは、上記のCodePenをfork して、その意図通りにならないテストケースを追加いただいてもけっこうです)

参考になれば幸いです。

投稿2020/02/26 02:36

編集2020/02/27 01:50
jun68ykt

総合スコア9058

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

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

gasorin

2020/02/26 23:53 編集

どうもありがとうございます。質問の流れのままできそうなので助かりました。 CodePenの方は知らないメソッドが大量にあり驚きました。テストしたいときに便利そうなコードですね!
jun68ykt

2020/02/27 00:54

どういたしまして。 > 質問の流れのままできそうなので助かりました。 とのことでよかったです???? 参考までに、CodePenに上げたコードでは、テストフレームワーク jest https://jestjs.io/ で書いたテストをwebブラウザで走らせて結果もブラウザで見るための jest-lite https://github.com/kvendrik/jest-lite を使っています。
gasorin

2020/02/27 02:00

大っ変勉強になります!どうもありがとうございます。
guest

0

ちょっとダサいですが。

javascript

1// [https://xxxxx, https://xxxxあああ,...]の配列にする 2var arr = str.replace(/https/gi, '____https').split('____').filter(function(v){ 3 return v.indexOf('https') != -1; 4}); 5 6// https://xxxxあああの「あああ」部分を削除。 7var urls = arr.map(function(v){ 8 return v.replace(/[\u3040-\u30ff]+$/, ''); 9});

投稿2020/02/26 01:45

mongolia

総合スコア133

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

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

gasorin

2020/02/26 23:41

どうもありがとうございます。____というのはどういう意味ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問