web-dev-qa-db-ja.com

文字列内のURLを見つけるための正規表現

誰もが文字列内のURLを見つけるために使用できる正規表現を知っていますか? Googleでは、文字列全体がURLであるかどうかを判断するための多くの正規表現を見つけましたが、文字列全体でURLを検索できる必要があります。たとえば、次の文字列でwww.google.comおよびhttp://yahoo.comを検索できるようにしたいと思います。

Hello www.google.com World http://yahoo.com

文字列内の特定のURLを探していません。文字列内のすべてのURLを探しているため、正規表現が必要です。

69
user758263

これは私が使用するものです

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

私のために働く、あなたのためにも働くはずです。

171
Rajeev

この使用に最適な正規表現はないと思います。かなりしっかりしたものを見つけました ここ

/(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/igm

ここに投稿された他のものと比較したいくつかの違い/利点:

  • 電子メールアドレスに一致しませんnot
  • Localhost:12345と一致します
  • httpまたはwwwなしのmoo.comのようなものは検出しません。

例については here を参照してください

29
Stefan Henze
text = """The link of this question: https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string
Also there are some urls: www.google.com, facebook.com, http://test.com/method?param=wasd
The code below catches all urls in text and returns urls in list."""

urls = re.findall('(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+', text)
print(urls)

出力:

[
    'https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string', 
    'www.google.com', 
    'facebook.com',
    'http://test.com/method?param=wasd'
]
12
GooDeeJaY

ここで提供された解決策のどれも、私が抱えていた問題/ユースケースを解決しませんでした。

ここで提供したものは、これまでに見つけた/作った最高のものです。処理できない新しいエッジケースが見つかったら更新します。

\b
  #Word cannot begin with special characters
  (?<![@.,%&#-])
  #Protocols are optional, but take them with us if they are present
  (?<protocol>\w{2,10}:\/\/)?
  #Domains have to be of a length of 1 chars or greater
  ((?:\w|\&\#\d{1,5};)[.-]?)+
  #The domain ending has to be between 2 to 15 characters
  (\.([a-z]{2,15})
       #If no domain ending we want a port, only if a protocol is specified
       |(?(protocol)(?:\:\d{1,6})|(?!)))
\b
#Word cannot end with @ (made to catch emails)
(?![@])
#We accept any number of slugs, given we have a char after the slash
(\/)?
#If we have endings like ?=fds include the ending
(?:([\w\d\?\-=#:%@&.;])+(?:\/(?:([\w\d\?\-=#:%@&;.])+))*)?
#The last char cannot be one of these symbols .,?!,- exclude these
(?<![.,?!-])
5
Squazz

この正規表現パターンはあなたが望むものを正確に処理すると思います

/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/

これは、Urlを抽出するスニペットの例です。

// The Regular Expression filter
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

// The Text you want to filter for urls
$text = "The text you want  https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string to filter goes here.";

// Check if there is a url in the text
preg_match_all($reg_exUrl, $text, $url,$matches);
var_dump($matches);
5
Yusef Mohamadi

上記の回答はすべて、URLのUnicode文字と一致しません。たとえば、 http://google.com?query=đức+filan+đã+search

ソリューションのために、これは動作するはずです:

(ftp:\/\/|www\.|https?:\/\/){1}[a-zA-Z0-9u00a1-\uffff0-]{2,}\.[a-zA-Z0-9u00a1-\uffff0-]{2,}(\S*)
3
Duc Filan

URLパターンがある場合は、文字列で検索できるはずです。パターンに^および$マークがURL文字列の先頭と末尾にないことを確認してください。したがって、PがURLのパターンである場合、Pに一致するものを探します。

2
manojlds

リンクの選択を厳しくする必要がある場合は、次のことを行います。

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))

詳細については、これを読んでください:

RLの一致のための改善された自由で正確な正規表現パターン

2

サブディレクトリ部分を含むほとんどのサンプルリンクをカバーする this が見つかりました。

正規表現:

(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?
1
Thilanka Bowala

私はこの正規表現を使用します:

/((\w+:\/\/\S+)|(\w+[\.:]\w+\S+))[^\s,\.]/ig

http://google.comhttps://dev-site.io:8080/home?val=1&count=1 のような多くのURLで正常に動作します、www.regexr.com、localhost:8080/path、...

1
Sillas Camara

短くてシンプル。私はまだJavaScriptコードでテストしていませんが、うまくいくようです:

((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*))

regex101.comのコード

Code preview

1
bafsar

次のようなURLを検出するために正規表現が必要な場合:

  1. https://www.youtube.com/watch?v=38XmKNcgjS
  2. https://www.youtube.com/
  3. www.youtube.com
  4. youtube.com ...

私はこの正規表現を思いつきました:

((http(s)?://)?([\w-]+\.)+[\w-]+[.com]+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)
1

以下の正規表現を使用して、文字列内のurlを見つけました。

/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/
0
aditya

これは最も単純なものです。私にとってはうまくいく。

%(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[a-z]*%
0
Md. Miraj Khan

これを使った

^(https?:\\/\\/([a-zA-z0-9]+)(\\.[a-zA-z0-9]+)(\\.[a-zA-z0-9\\/\\=\\-\\_\\?]+)?)$

おそらくあまりにも単純ですが、作業方法は次のとおりです。

[localhost|http|https|ftp|file]+://[\w\S(\.|:|/)]+

Pythonでテストしました。文字列解析の前後にスペースが含まれていて、URLに何も表示されていない限り(これまで見たことがない)、問題ありません。

これを示すオンラインideがあります

ただし、これを使用する利点は次のとおりです。

  • file:およびlocalhostおよびIPアドレスを認識します
  • neverそれらなしで一致します
  • #-などの異常な文字は気にしません(この投稿のURLを参照)
0
Simon

@JustinLeveneが提供する正規表現を使用すると、バックスラッシュに適切なエスケープシーケンスがありませんでした。現在は正しいように更新され、FTPプロトコルにも一致する条件が追加されました。プロトコルの有無にかかわらず、「www」なしのすべてのURLに一致します。

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

例: https://regex101.com/r/uQ9aL4/65

0

これは、(必要なものに応じて)Rajeevの答えに対するわずかな改善/調整です。

([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[A-Z\-_]+)+))([A-Z\-\.,@?^=%&amp;:/~\+#]*[A-Z\-\@?^=%&amp;/~\+#]){2,6}?

一致するものと一致しないものの例については、 here を参照してください。

これなしでURLをキャッチしたかったので、「http」などのチェックを取り除きました。難読化されたURLをキャッチするために正規表現にわずかに追加しました(つまり、ユーザーが「。」の代わりに[dot]を使用している場所)。最後に、「\ w」を「A-Z」および「{2,3}」に置き換えて、v2.0や「moo.0dd」などの誤検知を減らしました。

この歓迎の改善。

0
avjaarsveld