1

www.同様の質問はたくさんありますが、URLに、などがないという問題には答えられませんhttp://。私が探しているのは、文字列に任意のタイプのURLを含むURLが含まれているかどうかを確認することです。Twitterは、ツイートを送信するときにこれを行います。

使用可能なURLには、次のものが含まれますが、これらに限定されません。

私がDaringFireballから試した2つの正規表現とこの質問

var regex = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\"\\.,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]))/i;

var regex = /(?:<\w+.*?>|[^=!:'"\/]|^)((?:https?:\/\/|www\.)[-\w]+(?:\.[-\w]+)*(?::\d+)?(?:\/(?:(?:[~\w\+%-]|(?:[,.;@:][^\s$]))+)?)*(?:\?[\w\+%&=.;:-]+)?(?:\#[\w\-\.]*)?)(?:\p{P}|\s|<|$)/;

これが私が行っているテストの例です:http://jsfiddle.net/3Wn26/5/

4

4 に答える 4

4

これを確実に(時間の経過とともに)行うための良い方法はないと思います。新しいgTLDが登場しているので、追いつくのは難しいでしょう。とにかく、私はそれにショットを与えました。

/
  (
    \b
      (?:(https?|ftp):\/\/)?
      (
        (?:www\d{0,3}\.)?
        (
          [a-z0-9.-]+\.
          (?:[a-z]{2,4}|museum|travel)
          (?:\/[^\/\s]+)*
        )
      )
    \b
  )
/ix

グループをキャプチャする

  1. URL全体、例:http://www.google.com/anyquerystringSAY/Rfy/srA/yh
  2. プロトコル、例:http
  3. を含むURL www.、例:www.google.com/swrua8rua8rUWRWAURHAJSrjuhFAhjT/Rtgfsbdh
  4. を除くURL www.、例:google.com/sarwar8wa8r/R/A(R8またはimages.google.com/w9r89w9ar8a9sjfriJRIUS(RY/(YUr

(?:[a-z]{2,4}|museum|travel)オプションで、ビットをここにリストされているすべてのものに置き換えることができますが、そのリストは成長を停止することは決してないので、それだけの価値があるとは思えません。(博物館旅行の2つの例外を追加したことがわかります。)

また、ftpを追加したことに注意してください。不要な場合は、削除してください。

お役に立てれば。

実際に見てください

于 2012-06-18T22:05:30.020 に答える
1
(# Scheme
 [a-z][a-z0-9+\-.]*:
 (# Authority & path
  //
  ([a-z0-9\-._~%!$&'()*+,;=]+@)?              # User
  ([a-z0-9\-._~%]+                            # Named host
  |\[[a-f0-9:.]+\]                            # IPv6 host
  |\[v[a-f0-9][a-z0-9\-._~%!$&'()*+,;=:]+\])  # IPvFuture host
  (:[0-9]+)?                                  # Port
  (/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?          # Path
 |# Path without authority
  (/?[a-z0-9\-._~%!$&'()*+,;=:@]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?)?
 )
|# Relative URL (no scheme or authority)
 ([a-z0-9\-._~%!$&'()*+,;=@]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?  # Relative path
 |(/[a-z0-9\-._~%!$&'()*+,;=:@]+)+/?)                            # Absolute path
)
# Query
(\?[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?
# Fragment
(\#[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?

RFC3986。文字列がRFC3986で指定されているURLを保持しているかどうかを検証します。絶対URLと相対URLの両方がサポートされています。

于 2012-06-18T21:50:37.520 に答える
0

答えは-できません。

たとえば、Twitterは歌手のWill.I.Amの名前をURLとして扱います(.am有効なTLDです)。

すべてのTLDですべてのドメイン登録ルールを知らなければ、テストせずにURLが有効かどうかを知る方法はありません。

これが私があなたに提案することです。

  1. スクリプトを惜しみなく使用してください。「。」を含むほとんどすべての文字列を受け入れます。初期化。
  2. HTTP HEADリクエストを実行して、URLが存在するかどうかを確認します。
  3. WHOISを実行して、ドメインが登録されているかどうかを確認します(正確なURLが一致しない場合でも)

もちろん、これは誰かがイントラネットへのリンクを投稿した可能性があることを考慮に入れていません-それは彼らのフォロワーの何人かのために働くでしょう。

于 2012-06-19T07:58:39.677 に答える
0

FuncJSと呼ばれる私の単純なJavaScriptライブラリには、「findLinks()」と呼ばれる関数があります。この関数は、必要なことを実行できるはずです。

その中にリンクを含む文字列があるとしましょう。次のように、関数パラメータに含めるだけです。

findLinks("Visit my website at http://website.com and visit my profile on Twitter at http://twitter.com/yourProfile!");

次に、document.writeなどのさまざまなメソッドを使用して出力します。文字列は、リンクを強調表示して出力する必要があります。

この関数の理解を深めるには、http://docs.funcjs.webege.com/findLinks()。htmlのドキュメントをお読みください

これがあなたとこれをやりたいと思っている他の人に役立つことを願っています!:)

于 2012-11-24T00:38:28.207 に答える