Javascript Regex 模式来拾取 URL

Javascript Regex patterns to pickup URLs

本文关键字:URL Regex 模式 Javascript      更新时间:2023-09-26

首先,我知道这是不好的做法。我知道那里有一些图书馆应该对此有所帮助;然而,这是我被分配的任务,改变整个事情以使用库将比我们现在承担的工作量要多得多(因为我们的时间很紧(。

在我们的网络应用程序中,我们有人们通常在其中键入URL的字段。我们被分配了一项任务来"链接"任何看起来像 URL 的内容。目前,编写我们应用程序的人似乎已经使用正则表达式来确定文本字符串是否是URL。我基于此我的正则表达式(我不是正则表达式大师,甚至不是新手(。

"搜索"正则表达式如下所示

function DoesTextContainLinks(linktText) {
//replace all urls with links!
var linkifyValue = /((ftp|https?):'/'/)?(www'.)?([a-zA-Z0-9'-]{1,}'.){1,}[a-zA-Z0-9]{1,4}(:[0-9]{1,5})?('/[a-zA-Z0-9'-'_'.'?'&'#]{1,})*('/)?$/.test(linktText);
return linkifyValue;
}  

使用这个正则表达式和 https://regex101.com/我想出了两个大部分时间都有效的正则表达式。

function WrapLinkTextInAnchorTag(linkText) {
//capture links that only have www and add http to the begining of them (regex ignores entries that have http, https, and ftp in them. They are handled by the next regexes)
linkText = linkText.replace(/(^(?:(?!http).)*^(?:(?!ftp).)(www'.)?([a-zA-Z0-9'-]{1,}'.){1,}[a-zA-Z0-9]{1,4}(:[0-9]{1,5})?('/[a-zA-Z0-9'-'_'.'?'&'#]{1,})*('/)?$)/gim, "<a href='http://$1'>$1</a>");

//capture links that have https and http on them and fix those too. No need to prepend http here
linkText = linkText.replace(/(((https|http|ftp?):'/'/)?(www'.)?([a-zA-Z0-9'-]{1,}'.){1,}[a-zA-Z0-9]{1,4}(:[0-9]{1,5})?('/[a-zA-Z0-9'-'_'.'?'&'#]{1,})*('/)?$)/gim, "<a href='$1'>$1</a>");
return linkText;
}  

这里的问题是一些复杂的 URL 似乎不起作用。我不明白为什么它们不起作用。Regex101 非常糟糕,因为它告诉您每个部分在做什么;但是,我的麻烦是在正则表达式中组合这些关键字以使它们做我想做的事情。 我有两种情况需要考虑:当用户键入 www.something.com |ftp.something.com 以及用户实际键入 http://www.something.com 的时间。

我正在寻找一些帮助来指出我的 2 个正则表达式的确切问题,这些正则表达式阻止它们捕获如下所示的复杂 URL

https://pw.something.com/AAPS/default.aspx?guid=a5741c35-6fe1-31a1-b555-4028e931642b

我使用这个...

^(http|https|ftp)':'/'/[a-zA-Z0-9'-'.]+'.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?'/?([a-zA-Z0-9'-'._'?','''/'''+&amp;%'$#'=~])*$

看这里。。。正则表达式测试仪

URL RegExp需要(http,https,ftp(://,一个不错的域和一个不错的文件/文件夹字符串。允许 :在域名之后,以及文件/文件夹字符串中的这些字符(字母、数字、- _ ? , '/'' + & % $ # = ~(。它阻止所有其他特殊字符和id,以防止用户输入

如果你仔细观察,你会发现在你的正则表达式中没有任何地方匹配=字符。这就是你给出的例子的突破。

通过向路径中支持的字符添加'=来更改第二个正则表达式:

linkText.replace(/(((https|http|ftp?):'/'/)?(www'.)?([a-zA-Z0-9'-]{1,}'.){1,}[a-zA-Z0-9]{1,4}(:[0-9]{1,5})?('/[a-zA-Z0-9'-'_'.'?'&'#'=]{1,})*('/)?$)/gim, "<a href='$1'>$1</a>");

使示例 URL 匹配。也就是说,可能值得在 url (http://www.ietf.org/rfc/rfc3986.txt( 上通过 RFC 来查找 URL 中可能允许的其他字符(即使它们具有特殊含义(,因为您可能缺少其他一些字符。