複数 - javascript 正規表現 抽出




JavaScript Regexを使用して、テキストフィールド内のURLと一致させる (6)

正規表現を設定して、URLがjavascriptのテキストブロックに含まれているかどうかをテストする方法はありますか? 私はこれを達成するために使用するパターンをかなり理解することはできません

 var urlpattern = new RegExp( "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?"

 var txtfield = $('#msg').val() /*this is a textarea*/

 if ( urlpattern.test(txtfield) ){
        //do something about it
 }

編集:

だから私はパターンが私が今必要なもののための正規表現のテスターで動作しているが、クロムはエラーをスローする

  "Invalid regular expression: /(http|ftp|https)://[w-_]+(.[w-_]+)+([w-.,@?^=%&:/~+#]*[[email protected]?^=%&/~+#])?/: Range out of order in character class"

次のコードの場合:

var urlexp = new RegExp( '(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?' );

ここでは、最も完全な1つのURL解析パターンがあります。

これは、任意の部分文字列のANY URI / URLで動作します!

https://regex101.com/r/jO8bC4/5

出力を伴うJSコードの例 - すべてのURLは、 'parts'の5つの部分からなる配列に変換されます:

var re = /([a-z]+\:\/+)([^\/\s]*)([a-z0-9\[email protected]\^=%&;\/~\+]*)[\?]?([^ \#]*)#?([^ \#]*)/ig; 
var str = 'Bob: Hey there, have you checked https://www.facebook.com ?\n(ignore) https://github.com/justsml?tab=activity#top (ignore this too)';
var m;

while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    console.log(m);
}

次のようになります:

["https://www.facebook.com",
  "https://",
  "www.facebook.com",
  "",
  "",
  ""
]

["https://github.com/justsml?tab=activity#top",
  "https://",
  "github.com",
  "/justsml",
  "tab=activity",
  "top"
]

BAM! RegEx FTW!


(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?


ダッシュ文字(文字クラス内では文字範囲指定子として特別な意味を持つことができます)をエスケープすることはできますが、特殊な意味を取り除くもう1つの方法は、クラス定義の先頭または末尾に置くことです。

さらに、文字クラスの\+\@は、JavaScriptエンジンによって実際に+@として解釈されます。 しかし、エスケープは必要ではなく、視覚的に正規表現を解釈しようとする人を混乱させる可能性があります。

私はあなたの目的のために、次の正規表現をお勧めします:

(http|ftp|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\[email protected]?^=%&/~+#-])?

これはJavaScriptでRegExpコンストラクタに渡すことで指定できます(例のように)。

var urlPattern = new RegExp("(http|ftp|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\[email protected]?^=%&/~+#-])?")

//クォート方法を使って正規表現リテラルを直接指定することによって、

var urlPattern = /(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\[email protected]?^=%&\/~+#-])?/

RegExpコンストラクタは正規表現を文字列(ユーザ入力やAJAX呼び出しなど)として受け入れ、読みやすく(この場合)する必要があります。 私は//クォート方法がより効率的であることをかなり確信しており、特定の時にもっと読みやすくなっています。 どちらも動作します。

私はあなたのオリジナルとこの変更を、 JSFiddle >と< JSFiddle >の両方のChromeを使って、クライアントサイド正規表現エンジン(ブラウザ)を使って、特にJavaScriptを選択してテストしました。 あなたが述べたエラーで最初のものが失敗するのに対し、私の提案された修正は成功します。 ソースのhttpからhを削除した場合、一致する必要があります。

編集

コメントの中で@noaで指摘したように、上記の式は、ローカルネットワーク(非インターネット)サーバーまたは単一の単語でアクセスされる他のサーバー( http://localhost/ ...またはhttps://sharepoint-test-server/ ...)。 このタイプのURLにマッチすることが望ましい場合(そうでない場合もあります)、以下の方が適切です:

(http|ftp|https)://[\w-]+(\.[\w-]+)*([\w.,@?^=%&amp;:/~+#-]*[\[email protected]?^=%&amp;/~+#-])?

#------changed----here-------------^

< 終了編集 >

最後に、私が正規表現について知っていることの90%を教えてくれた素晴らしいリソースはRegular-Expressions.infoです。正規表現を学びたいなら、それを強くお勧めします。


問題は、文字クラス(括弧)の " - "が範囲として解析されていることです。[az]は "aとzの間の任意の文字"を意味します。 Vini-Tが示唆するように、文字クラスの " - "文字をバックスラッシュでエスケープする必要があります。


私のためにこれを試してみてください

/^((ftp|http[s]?):\/\/)?(www\.)([a-z0-9]+)\.[a-z]{2,5}(\.[a-z]{2})?$/

それはとても簡単で分かりやすい


私はあなたの正規表現をきれいにしました:

var urlexp = new RegExp('(http|ftp|https)://[a-z0-9\-_]+(\.[a-z0-9\-_]+)+([a-z0-9\-\.,@\?^=%&;:/~\+#]*[a-z0-9\[email protected]\?^=%&;/~\+#])?', 'i');

テストされ、うまく動作します;)





regex