11

これまでに1000回も聞かれたことは知っていますが(お詫び)、SO/Googleなどを検索してもまだ決定的な答えは得られていません。

基本的に、文字列を渡すと、正規表現に基づいてすべてのURLを識別して抽出し、見つかったすべての配列を返すJS関数が必要です。例えば:

function findUrls(searchText){
    var regex=???
    result= searchText.match(regex);
    if(result){return result;}else{return false;}
}

関数は、潜在的なURLを検出して返すことができる必要があります。私はこれに内在する困難/問題(括弧を閉じるなど)を認識しているので、プロセスは次のようにする必要があると感じています。

文字列(searchText)を開始/終了する個別のセクションに分割します。そのいずれかの側にスペースまたはキャリッジリターンがあり、分割を行うなど、個別のコンテンツチャンクが生成されます。

分割の結果として生じる各コンテンツチャンクについて、それが任意の構造のURLのロジックに適合するかどうか、つまり、テキストの直後にピリオドが含まれているかどうかを確認します(潜在的なURLを修飾するための1つの一定のルール)。

正規表現は、ピリオドの直後に、tld、ディレクトリ構造、およびクエリ文字列で許可されるタイプの他のテキストが続き、URLで許可されるタイプのテキストが前にあるかどうかを確認する必要があります。

誤検知が発生する可能性があることは承知していますが、戻り値はURL自体の呼び出しでチェックされるため、これは無視できます。私が見つけた他の関数は、存在する場合、URLクエリ文字列も返さないことがよくあります。

したがって、関数は、will.i.amを有効なものとして識別することを意味する場合でも、テキストのブロックから任意のタイプのURLを返すことができるはずです。

例えば。http://www.google.com、google.com、www.google.com、http//google.com、ftp.google.com、https://など...およびクエリ文字列を使用したそれらの派生返される必要があります...

これがSOの他の場所に存在するが、私の検索では返されなかった場合は、再度お詫び申し上げます。

4

5 に答える 5

25

私はURI.jsを使用しています-簡単にできます。

var source = "Hello www.example.com,\n"
    + "http://google.com is a search engine, like http://www.bing.com\n"
    + "http://exämple.org/foo.html?baz=la#bumm is an IDN URL,\n"
    + "http://123.123.123.123/foo.html is IPv4 and "
    + "http://fe80:0000:0000:0000:0204:61ff:fe9d:f156/foobar.html is IPv6.\n"
    + "links can also be in parens (http://example.org) "
    + "or quotes »http://example.org«.";

var result = URI.withinString(source, function(url) {
    return "<a>" + url + "</a>";
});

/* result is:
Hello <a>www.example.com</a>,
<a>http://google.com</a> is a search engine, like <a>http://www.bing.com</a>
<a>http://exämple.org/foo.html?baz=la#bumm</a> is an IDN URL,
<a>http://123.123.123.123/foo.html</a> is IPv4 and <a>http://fe80:0000:0000:0000:0204:61ff:fe9d:f156/foobar.html</a> is IPv6.
links can also be in parens (<a>http://example.org</a>) or quotes »<a>http://example.org</a>«.
*/
于 2013-09-07T06:11:18.817 に答える
16

URI.jsの正規表現を使用できます:

// gruber revised expression - http://rodneyrehm.de/t/url-regex.html
var uri_pattern = /\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`!()\[\]{};:'".,<>?«»“”‘’]))/ig;

String#matchまたはString#replaceが役立つ場合があります…</ p>

于 2012-06-26T14:03:18.967 に答える
2

正規表現に続いて、文字列(クエリ文字列を含む)からURLを抽出し、配列を返します

var url = "asdasdla hakjsdh aaskjdh https://www.google.com/search?q=add+a+element+to+dom+tree&oq=add+a+element+to+dom+tree&aqs=chrome..69i57.7462j1j1&sourceid=chrome&ie=UTF-8 askndajk nakjsdn aksjdnakjsdnkjsn";

var matches = strings.match(/\bhttps?::\/\/\S+/gi) || strings.match(/\bhttps?:\/\/\S+/gi);

出力:

["https://www.google.com/search?q=format+to+6+digir&…s=chrome..69i57.5983j1j1&sourceid=chrome&ie=UTF-8"]

注: これは、文字列にシングルコロンを含むhttp://とダブルコロンを含むhttp://の両方を処理します。また、httpsの場合はその逆であるため、安全に使用できます。:)

于 2019-01-10T10:37:24.123 に答える
1

これを試して

var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;

このWebサイトを使用して、正規表現をテストできますhttp://gskinner.com/RegExr/

于 2012-06-26T14:05:07.483 に答える
0

UIPath Studioでは、次の組み込み正規表現ルールが定義されています。

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

于 2021-10-22T09:23:15.537 に答える