正規表現を用いたURLチェックを実装しているのですが、現状のチェックメソッドではhttp://aaa
こちらの値を入力すると、True
を返してしまいます。
下記がURLチェックの為に、実装したメソッドになります。
check_url(url){ let re = /https?://[\w/:%#$&?()~.=+-]+/ return re.test(url); },
どなたか、こちらの問題の解決の為、ご助言頂けましたら幸いです。
追記です
以下は、想定しているOKパターン及びNGパターンになります。
○合格のurl例
http://qiita.com
https://qiita.com
https://sample.qiita.com
https://qiita.com/sample
https://qiita.com/sample/aaaa?a=aa
https://qiita.com/sample/aaaa?a=aa&b=bb
https://b.qiita.com/sample/aaaa?a=aa&b=bb
×不合格のurl例
http://qiitaacom
javascript:alert( 'test' )
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/23 02:24
2020/09/23 02:45 編集
2020/09/23 02:50
2020/09/23 02:52
2020/09/23 02:54 編集
2020/09/23 02:55
2020/09/23 02:58
2020/09/23 08:02
回答6件
0
前も書いた気がするんですがjsでURLチェックするのは費用対効果にあわないので
最低限のものにしてください
投稿2020/09/23 02:07
総合スコア116724
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/23 02:41 編集
2020/09/23 02:45
2020/09/23 02:48
2020/09/23 03:02
2020/09/23 03:06
2020/09/23 03:12
2020/09/23 03:16
2020/09/23 03:20 編集
2020/09/23 03:27
2020/09/23 03:32
2020/09/23 03:39
2020/09/23 03:41
2020/09/23 03:59 編集
2020/09/23 04:01
0
それで構わないのではないでしょうか。hosts
にaaa
を設定すれば、 http://aaa
もアクセス可能です。http://localhost
とそんなに変わりません。
投稿2020/09/23 02:00
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/23 02:15 編集
2020/09/23 02:33
2020/09/23 02:40
2020/09/23 02:45
2020/09/23 02:54
2020/09/23 02:58
2020/09/23 03:02
2020/09/23 03:13
2020/09/23 08:06
0
Djangoライブラリの「URLValidator」を使用しており、そこでも「http://qiitaacom」こちらのチェックは弾かれる為、フロント側でも出来たら弾きたいのですよね。。
django/validators.py at master · django/django · GitHub
Django の URLVaridator のソースコードです。正規表現でチェックしているので、移植はそれほど難しくないと思います。
追記
Python をブラウザ上で動かすという方法も無くはありません。
https://www.publickey1.jp/blog/19/pythonwebassemblywebpythonpyodidemozilla.html
(開発中)
またはバックエンドがいじれるならバリデーション API を作り、フロントでは URL オブジェクトを作れるかどうかを判定して、それに通ったものだけ API で問い合わせるという方法もあります。
投稿2020/09/23 09:56
編集2020/09/23 23:26総合スコア28669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
文法規則
○合格のurl例
plain
1http://qiita.com 2https://qiita.com 3https://sample.qiita.com 4https://qiita.com/sample 5https://qiita.com/sample/aaaa?a=aa 6https://qiita.com/sample/aaaa?a=aa&b=bb 7https://b.qiita.com/sample/aaaa?a=aa&b=bb
×不合格のurl例
plain
1http://qiitaacom 2javascript:alert( 'test' )
ご掲示のURLは全て「正しいURL」です。
期待する動作を得る為には合格or不合格のURLの文法規則を study_111 さんが確定させる必要があります。
new URL()
URL()
コンストラクタを利用すると、比較的簡単に実装できます。
「URLの文法規則」は質問文にないので、想像で補完しました。
※質問に「文法規則」を書かないと、回答者は正しいコードを書けませんので、質問時に注意する事をお勧めします。
JavaScript
1'use strict'; 2const okList = ['http://qiita.com','https://qiita.com','https://sample.qiita.com','https://qiita.com/sample','https://qiita.com/sample/aaaa?a=aa','https://qiita.com/sample/aaaa?a=aa&b=bb','https://b.qiita.com/sample/aaaa?a=aa&b=bb']; 3const ngList = ['http://qiitaacom','javascript:alert( \'test\' )']; 4 5function isCustomValidUrl (urlString) { 6 try { 7 const url = new URL(urlString); 8 return url.hostname.includes('.') && url.protocol !== 'javascript:'; 9 } catch (e) { 10 return false; 11 } 12} 13 14console.assert(JSON.stringify(okList.filter(isCustomValidUrl)) === JSON.stringify(okList)); 15console.assert(JSON.stringify(ngList.filter(isCustomValidUrl)) === '[]');
正規表現
正規表現を用いたURLチェックを実装しているのですが、
正規表現に拘るなら、RFC3986を元に組んだことが有ります。
現在では「URL Standard」が最も新しいと思われますので、そちらを参考に正規表現を組むと良いと思います。
Re: study_111 さん
投稿2020/09/23 07:50
編集2020/09/23 08:04総合スコア18189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/23 09:16 編集
2020/09/23 09:25 編集
2020/09/23 09:36 編集
2020/09/23 09:38
2020/09/23 10:01 編集
2020/09/23 10:01
2020/09/23 10:06
2020/09/23 10:14
2020/09/23 10:21
2020/09/23 10:40 編集
2020/09/23 10:44 編集
2020/09/23 10:49
0
正規表現を用いたURLチェック
IE 以外が対象であれば、以下のネイティブ実装を使ったほうがよいかもしれません。
- URL
- URLSearchParams
- Array(等) で作成した whitelist / blacklist
正規表現を用いるケースとしては CODEPEN parseURL() を回答したことがあります
(whitelist / blacklist 併用を想定した単純な字句解析です)。
追記)
ご助言頂けましたら
クライアントサーバモデル はご存知と思いますが、再確認してみてください。
クライアント(ブラウザ)側の JavaScript で出来ることは2つに限られます。
- Ajaxでサーバー(API)にDNS問い合わせを含めた厳密なURLチェックするように要求し、結果を得る
(リクエスト数 +1で実現可能)
2. DNS問い合わせまでは行わず、URL(文字列)を判別し、予め用意したリストと照合するに留める
(リクエスト数 +0で実現可能)
共に回答は出揃っていますが、「正規表現」が要となるのは、後者の方法でPOST前の簡易チェックに留めるケースです。
「2つある方法のうち、いずれかを選択する」というアプローチを検討してもよいと思います。
投稿2020/09/23 03:06
編集2020/09/23 22:47総合スコア5434
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。