2012-01-09 2 views
0

小さなブックマークアプリのURLバリデーターを作成しようとしています。URL Validator:http:// not typedが動的に渡された場合

私はそれが有効であるべきか受け入れるように受け入れるためにバリデーターを行っている:我々は通常のhttpを入力しない現実の生活の中で私たちの

http://example.com 
http://www.examples.com 
http://www.example.com 
ftp://www.example.com 
ftp://cdn.example.com/ 
etc. 

今のように多く://ウェブサイトのために私はユーザーがhttp://、https://、ftp://を使わずに何かを入力して、デフォルトでhttp://を渡す必要があります。入力に渡すのではなく、バックエンドに渡したいと思います。 HTTP場合

$("#in").on('keyup', function() {  
    var url = $('#in').val(); 

    var match = /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/ 


    if (match.test(url)) { 
     console.log("URL OK") 

    } else { 
     console.log("URL invalid") 

    } 

}); 

://型付けではないが、有効なURLとして表示するようにconsole.logに渡し

だから、私は例えば、私はこれを持っています。

これは多くのバグに終わる可能性があるため、これは良い方法ではありませんが、私がhttp://ウェブサイトで終わると思う唯一の方法です。私はユーザーにすべてのブックマークにhttp://を入力させることはできません。

また、プラグインを使用したくないことにご注意ください。

私もこのことについてあなたの考えを教えてください。 URLが失敗した場合、それは一致したが、プロトコルを逃した場合

おかげ

答えて

0

あなたのマッチが有効であると仮定すると...効果的

$("#in").on('keyup', function() {  
    var url = $('#in').val(); 

    var match = /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/; 

    var noprotocolmatch = /^(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/; 

    if (match.test(url)) { 
     console.log("URL OK with protocol"); 

    } else if (noprotocolmatch.test(url)) { 
     console.log("URL OK without protocol"); 
     url = 'http://'+url; 

    } else { 
     console.log("URL invalid") 

    } 

}); 

は、我々は、少なくとも第2の部分に対してそれを一致させようと我々それを追加し、すべてが失敗した場合は無効です。

またはこのような、最初の試合で、オプションのプロトコルで、ちょうどステップ2でのプロトコルの存在をチェック:

$("#in").on('keyup', function() {  
    var url = $('#in').val(); 

    var match = /^((https?|ftp):\/\/)?(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/; 
    var protomatch = /^(https?|ftp):\/\/(.*)/; 

    if (match.test(url)) { 
     console.log("URL OK"); 

     if(!protomatch.test(url)) 
      url = 'http://'+url; 

    } else { 
     console.log("URL invalid") 

    } 

}); 
+0

ありがとうございます。私が探していたもの。これは良い習慣だと思いますか?私はそれが多くのバグに終わると思っていたのですか? – jQuerybeast

+0

クリーンな方法で実装されていれば、これはバグの傾向があまりありませんが、URL検証の正規表現についていくつかの研究をしたいと思うかもしれません。一方、クライアント制御のコードなので、悪意のあるコードが送信されていないかどうかを確かめることができないため、サーバー上でこれを行うことをお勧めします。とにかくサーバーのセキュリティ上の問題がないかどうかチェックする必要があります。そのため、まず最初にフィルタリングしないでください。 – bardiir

+0

ブックマークはlocalstorageに基づいているため、私のサーバーから何も渡されません。私はURLの検証のための研究をした、なぜこの長いregExpに終わったのか。問題は、誰かがバグのあるURLを見つけたり追加したりしようとすると、達成することになるということです。それ以外に、私はユーザーが実際のURLで終わると信じています。 – jQuerybeast

0

まず:フォーム上のバインドがkeyup

に提出していませんすべてのキーストロークでURLを検証することは、を確認する必要があるだけで、サーバーに送信されるより前にチェックする必要があるため、非常に非効率です。 (タイピング速度に依存する)は、第2のあなたのURLの解析/検証だけ提出する1ページあたり1回実行されます

$('FORM').on('submit', function() { 
if (!url_is_valid()) { 
    return false; // Cancel form submission when URL isn't valid. 
        // You'll need to display an error message as well. 
} 
}); 

、代わりに数回:だからではなく、このイベントハンドラを使用します。

第二:

はまた、私は、プラグインのいずれかの種類を使用したいいけないことに注意してください。

JavaScriptのURI解析はsolved problemです。車輪を再発明しないでください。

+0

キーアップは、テスト目的のためであり、主にstackoverflowのためです。私とユーザーは結果をより速く見ることができます。そして、いいえ、私は何も使いたくないし、どんな種類のプラグインも使用しないでしょう。 bardiirの回答から1行余分に私に1263行のひどいプラグインが保存されました。 – jQuerybeast

+0

あなたの作品は何でも大事です。私は、jQueryの機能の5%でも使用する可能性は非常に低いとはいえ、9000 + LOCでクロックを取るjQueryを使用しても面白いと思っています。そのため、船はすでに航海しているようです。 – leepowers

関連する問題