誰もが文字列内のURLを見つけるために使用できる正規表現を知っていますか? Googleでは、文字列全体がURLであるかどうかを判断するための多くの正規表現を見つけましたが、文字列全体でURLを検索できる必要があります。たとえば、次の文字列でwww.google.com
およびhttp://yahoo.com
を検索できるようにしたいと思います。
Hello www.google.com World http://yahoo.com
文字列内の特定のURLを探していません。文字列内のすべてのURLを探しているため、正規表現が必要です。
これは私が使用するものです
(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?
私のために働く、あなたのためにも働くはずです。
この使用に最適な正規表現はないと思います。かなりしっかりしたものを見つけました ここ
/(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/igm
ここに投稿された他のものと比較したいくつかの違い/利点:
http
またはwww
なしのmoo.com
のようなものは検出しません。例については here を参照してください
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'
]
ここで提供された解決策のどれも、私が抱えていた問題/ユースケースを解決しませんでした。
ここで提供したものは、これまでに見つけた/作った最高のものです。処理できない新しいエッジケースが見つかったら更新します。
\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
(?<![.,?!-])
この正規表現パターンはあなたが望むものを正確に処理すると思います
/(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);
上記の回答はすべて、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*)
URLパターンがある場合は、文字列で検索できるはずです。パターンに^
および$
マークがURL文字列の先頭と末尾にないことを確認してください。したがって、PがURLのパターンである場合、Pに一致するものを探します。
リンクの選択を厳しくする必要がある場合は、次のことを行います。
(?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`!()\[\]{};:'".,<>?«»“”‘’]))
詳細については、これを読んでください:
サブディレクトリ部分を含むほとんどのサンプルリンクをカバーする this が見つかりました。
正規表現:
(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?
私はこの正規表現を使用します:
/((\w+:\/\/\S+)|(\w+[\.:]\w+\S+))[^\s,\.]/ig
http://google.com 、 https://dev-site.io:8080/home?val=1&count=1 のような多くのURLで正常に動作します、www.regexr.com、localhost:8080/path、...
短くてシンプル。私はまだJavaScriptコードでテストしていませんが、うまくいくようです:
((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*))
次のようなURLを検出するために正規表現が必要な場合:
私はこの正規表現を思いつきました:
((http(s)?://)?([\w-]+\.)+[\w-]+[.com]+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)
以下の正規表現を使用して、文字列内のurlを見つけました。
/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/
これは最も単純なものです。私にとってはうまくいく。
%(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[a-z]*%
これを使った
^(https?:\\/\\/([a-zA-z0-9]+)(\\.[a-zA-z0-9]+)(\\.[a-zA-z0-9\\/\\=\\-\\_\\?]+)?)$
おそらくあまりにも単純ですが、作業方法は次のとおりです。
[localhost|http|https|ftp|file]+://[\w\S(\.|:|/)]+
Pythonでテストしました。文字列解析の前後にスペースが含まれていて、URLに何も表示されていない限り(これまで見たことがない)、問題ありません。
ただし、これを使用する利点は次のとおりです。
file:
およびlocalhost
およびIPアドレスを認識します#
や-
などの異常な文字は気にしません(この投稿のURLを参照)@JustinLeveneが提供する正規表現を使用すると、バックスラッシュに適切なエスケープシーケンスがありませんでした。現在は正しいように更新され、FTPプロトコルにも一致する条件が追加されました。プロトコルの有無にかかわらず、「www」なしのすべてのURLに一致します。
コード:^((http|ftp|https):\/\/)?([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?
これは、(必要なものに応じて)Rajeevの答えに対するわずかな改善/調整です。
([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[A-Z\-_]+)+))([A-Z\-\.,@?^=%&:/~\+#]*[A-Z\-\@?^=%&/~\+#]){2,6}?
一致するものと一致しないものの例については、 here を参照してください。
これなしでURLをキャッチしたかったので、「http」などのチェックを取り除きました。難読化されたURLをキャッチするために正規表現にわずかに追加しました(つまり、ユーザーが「。」の代わりに[dot]を使用している場所)。最後に、「\ w」を「A-Z」および「{2,3}」に置き換えて、v2.0や「moo.0dd」などの誤検知を減らしました。
この歓迎の改善。