0

テキスト入力に入力された URL を検出したいと思います。http://入力したものの先頭に追加する次のコードがあります。

var input = $(this);
var val = input.val();
if (val && !val.match(/^http([s]?):\/\/.*/)) {
    input.val('http://' + val);
}

http://文字列の後にtldが続く場合にのみ追加するようにこれを適応させるにはどうすればよいですか? たとえば、文字列を入力すると、現時点では次のようになります。

Hello. This is a test

これhttp://は URL ではありませんが、hello に追加されます。どんな助けでも大歓迎です。

4

3 に答える 3

0

私が見つけた最善の解決策は、次の正規表現を使用することです。

/\.[a-zA-Z]{2,3}/

これにより.、URL の後の と、2/3 文字を制限する拡張子の文字が検出されます。

これは基本的な検証には問題ないと思われますか? 発生する可能性のある問題が発生した場合はお知らせください。

メールアドレスが検出されることは知っていますが、この場合は問題になりません。

于 2013-10-21T11:52:20.680 に答える
0

正規表現を使用した URL 検出は非常に難しい場合があるため、最初に要件を絞り込む必要があります。これらは、パーサーが失敗する可能性があるいくつかの状況です。

  • IDN ( госуслуги.рф)
  • Punycode ケース ( xn--blah)
  • 新規TLD登録中 ( .amazon)
  • SEO に適した URL ( domain.com/Everything you need to know about RegEx.aspx)

私たちは最近、同様の問題に直面し、最終的に行ったのは、URL がhttp://https://、またはftp://のいずれかで始まっているかどうかを簡単にチェックするhttp://ことでした。TypeScript での実装は次のとおりです。

public static EnsureAbsoluteUri(uri: string): string {
  var ret = uri || '', m = null, i = -1;
  var validSchemes = ko.utils.arrayMap(['http', 'https', 'ftp'], (i) => { return i + '://' });

  if (ret && ret.length) {
    m = ret.match(/[a-z]+:\/\//gi);

    /* Checking against a list of valid schemes and prepending with "http://" if check fails. */
    if (m == null || !m.length || (i = $.inArray(m[0].toLowerCase(), validSchemes)) < 0 ||
      (i >= 0 && ret.toLowerCase().indexOf(validSchemes[i]) != 0)) {

      ret = 'http://' + ret;
    }
  }

  return ret;
}

ご覧のとおり、すべての可能な URL フォームを予測することはできないため、ここでは賢くしようとはしていません。さらに、このメソッドは通常、URL であることがわかっているフィールド値に対して実行されるため、誤検出の変化は最小限に抑えられます。

お役に立てれば。

于 2013-10-21T10:28:54.707 に答える
0

この単純な機能は私にとってはうまくいきます。速度を上げるために TLD ドメインの実際の存在は気にしませんが、example.com のような構文をチェックします。

申し訳ありませんが、VBAのトリム() は js の組み込み関数ではないことを忘れていました。

// Removes leading whitespaces
function LTrim(value)
{
    var re = /\s*((\S+\s*)*)/;
    return value.replace(re, "$1");
}

// Removes ending whitespaces
function RTrim(value)
{
    var re = /((\s*\S+)*)\s*/;
    return value.replace(re, "$1");
}

// Removes leading and ending whitespaces
function trim(value)
{
    return LTrim(RTrim(value));
}

function hasDomainTld(strAddress)
{ 
  var strUrlNow = trim(strAddress);
  if(strUrlNow.match(/[,\s]/))
  {
    return false;
  }
  var i, regex = new RegExp(); 
  regex.compile("[A-Za-z0-9\-_]+\\.[A-Za-z0-9\-_]+$"); 
  i = regex.test(strUrlNow);
  regex = null;
  return i;
} 

したがって、コード $(this) はウィンドウ オブジェクトなので、jQuery の代わりに従来の js を使用して、objInput を引数に渡します。

function checkIt(objInput)
{
  var val = objInput.value;
  if(val.match(/http:/i)) {
    return false;
  }
  else if (hasDomainTld(val)) {
    objInput.value = 'http://' + val;
  }
}

自分でテストしてください: http://jsfiddle.net/SDUkZ/8/

于 2013-10-21T10:15:24.960 に答える