gopkg.in/ini.v1 v1.61.0 | gopkg.in/ini.v1 v1.61.0 | ||||
gopkg.in/ldap.v3 v3.0.2 | gopkg.in/ldap.v3 v3.0.2 | ||||
gopkg.in/yaml.v2 v2.3.0 | gopkg.in/yaml.v2 v2.3.0 | ||||
mvdan.cc/xurls/v2 v2.1.0 | |||||
mvdan.cc/xurls/v2 v2.2.0 | |||||
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 | strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 | ||||
xorm.io/builder v0.3.7 | xorm.io/builder v0.3.7 | ||||
xorm.io/xorm v1.0.5 | xorm.io/xorm v1.0.5 |
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= | |||||
github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= | github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= | ||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= | github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= | ||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= | github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= | ||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | ||||
mvdan.cc/xurls/v2 v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA= | |||||
mvdan.cc/xurls/v2 v2.1.0/go.mod h1:5GrSd9rOnKOpZaji1OZLYL/yeAAtGDlo/cFe+8K5n8E= | |||||
mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8= | |||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= | ||||
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 h1:mUcz5b3FJbP5Cvdq7Khzn6J9OCUQJaBwgBkCR+MOwSs= | strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 h1:mUcz5b3FJbP5Cvdq7Khzn6J9OCUQJaBwgBkCR+MOwSs= | ||||
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:FJGmPh3vz9jSos1L/F91iAgnC/aejc0wIIrF2ZwJxdY= | strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:FJGmPh3vz9jSos1L/F91iAgnC/aejc0wIIrF2ZwJxdY= |
gopkg.in/yaml.v2 | gopkg.in/yaml.v2 | ||||
# gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 | # gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 | ||||
gopkg.in/yaml.v3 | gopkg.in/yaml.v3 | ||||
# mvdan.cc/xurls/v2 v2.1.0 | |||||
# mvdan.cc/xurls/v2 v2.2.0 | |||||
## explicit | ## explicit | ||||
mvdan.cc/xurls/v2 | mvdan.cc/xurls/v2 | ||||
# strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 | # strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 |
[![GoDoc](https://godoc.org/mvdan.cc/xurls?status.svg)](https://godoc.org/mvdan.cc/xurls) | [![GoDoc](https://godoc.org/mvdan.cc/xurls?status.svg)](https://godoc.org/mvdan.cc/xurls) | ||||
Extract urls from text using regular expressions. Requires Go 1.12 or later. | |||||
Extract urls from text using regular expressions. Requires Go 1.13 or later. | |||||
```go | ```go | ||||
import "mvdan.cc/xurls/v2" | import "mvdan.cc/xurls/v2" | ||||
} | } | ||||
``` | ``` | ||||
Note that the funcs compile regexes, so avoid calling them repeatedly. | |||||
Since API is centered around [regexp.Regexp](https://golang.org/pkg/regexp/#Regexp), | |||||
many other methods are available, such as finding the [byte indexes](https://golang.org/pkg/regexp/#Regexp.FindAllIndex) | |||||
for all matches. | |||||
Note that calling the exposed functions means compiling a regular expression, so | |||||
repeated calls should be avoided. | |||||
#### cmd/xurls | #### cmd/xurls | ||||
To install the tool globally: | To install the tool globally: | ||||
go get mvdan.cc/xurls/cmd/xurls | |||||
cd $(mktemp -d); go mod init tmp; GO111MODULE=on go get mvdan.cc/xurls/v2/cmd/xurls | |||||
```shell | ```shell | ||||
$ echo "Do gophers live in http://golang.org?" | xurls | $ echo "Do gophers live in http://golang.org?" | xurls |
module mvdan.cc/xurls/v2 | module mvdan.cc/xurls/v2 | ||||
go 1.13 | |||||
go 1.14 | |||||
require ( | |||||
github.com/rogpeppe/go-internal v1.5.2 | |||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect | |||||
) |
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= | |||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | |||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | |||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | |||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | |||||
github.com/rogpeppe/go-internal v1.5.2 h1:qLvObTrvO/XRCqmkKxUlOBc48bI3efyDuAZe25QiF0w= | |||||
github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= | |||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= | |||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||||
gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= | |||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= |
`dpp`, | `dpp`, | ||||
`drm`, | `drm`, | ||||
`drop`, | `drop`, | ||||
`dtmi`, | |||||
`dtn`, | `dtn`, | ||||
`dvb`, | `dvb`, | ||||
`ed2k`, | `ed2k`, | ||||
`pack`, | `pack`, | ||||
`palm`, | `palm`, | ||||
`paparazzi`, | `paparazzi`, | ||||
`payment`, | |||||
`payto`, | `payto`, | ||||
`pkcs11`, | `pkcs11`, | ||||
`platform`, | `platform`, | ||||
`pttp`, | `pttp`, | ||||
`qb`, | `qb`, | ||||
`query`, | `query`, | ||||
`quic-transport`, | |||||
`redis`, | `redis`, | ||||
`rediss`, | `rediss`, | ||||
`reload`, | `reload`, |
`alsace`, | `alsace`, | ||||
`alstom`, | `alstom`, | ||||
`am`, | `am`, | ||||
`amazon`, | |||||
`americanexpress`, | `americanexpress`, | ||||
`americanfamily`, | `americanfamily`, | ||||
`amex`, | `amex`, | ||||
`career`, | `career`, | ||||
`careers`, | `careers`, | ||||
`cars`, | `cars`, | ||||
`cartier`, | |||||
`casa`, | `casa`, | ||||
`case`, | `case`, | ||||
`caseih`, | `caseih`, | ||||
`chintai`, | `chintai`, | ||||
`christmas`, | `christmas`, | ||||
`chrome`, | `chrome`, | ||||
`chrysler`, | |||||
`church`, | `church`, | ||||
`ci`, | `ci`, | ||||
`cipriani`, | `cipriani`, | ||||
`do`, | `do`, | ||||
`docs`, | `docs`, | ||||
`doctor`, | `doctor`, | ||||
`dodge`, | |||||
`dog`, | `dog`, | ||||
`domains`, | `domains`, | ||||
`dot`, | `dot`, | ||||
`eurovision`, | `eurovision`, | ||||
`eus`, | `eus`, | ||||
`events`, | `events`, | ||||
`everbank`, | |||||
`exchange`, | `exchange`, | ||||
`expert`, | `expert`, | ||||
`exposed`, | `exposed`, | ||||
`kz`, | `kz`, | ||||
`la`, | `la`, | ||||
`lacaixa`, | `lacaixa`, | ||||
`ladbrokes`, | |||||
`lamborghini`, | `lamborghini`, | ||||
`lamer`, | `lamer`, | ||||
`lancaster`, | `lancaster`, | ||||
`lancia`, | `lancia`, | ||||
`lancome`, | |||||
`land`, | `land`, | ||||
`landrover`, | `landrover`, | ||||
`lanxess`, | `lanxess`, | ||||
`lexus`, | `lexus`, | ||||
`lgbt`, | `lgbt`, | ||||
`li`, | `li`, | ||||
`liaison`, | |||||
`lidl`, | `lidl`, | ||||
`life`, | `life`, | ||||
`lifeinsurance`, | `lifeinsurance`, | ||||
`monash`, | `monash`, | ||||
`money`, | `money`, | ||||
`monster`, | `monster`, | ||||
`mopar`, | |||||
`mormon`, | `mormon`, | ||||
`mortgage`, | `mortgage`, | ||||
`moscow`, | `moscow`, | ||||
`motorcycles`, | `motorcycles`, | ||||
`mov`, | `mov`, | ||||
`movie`, | `movie`, | ||||
`movistar`, | |||||
`mp`, | `mp`, | ||||
`mq`, | `mq`, | ||||
`mr`, | `mr`, | ||||
`mz`, | `mz`, | ||||
`na`, | `na`, | ||||
`nab`, | `nab`, | ||||
`nadex`, | |||||
`nagoya`, | `nagoya`, | ||||
`name`, | `name`, | ||||
`nationwide`, | `nationwide`, | ||||
`photography`, | `photography`, | ||||
`photos`, | `photos`, | ||||
`physio`, | `physio`, | ||||
`piaget`, | |||||
`pics`, | `pics`, | ||||
`pictet`, | `pictet`, | ||||
`pictures`, | `pictures`, | ||||
`song`, | `song`, | ||||
`sony`, | `sony`, | ||||
`soy`, | `soy`, | ||||
`spa`, | |||||
`space`, | `space`, | ||||
`sport`, | `sport`, | ||||
`spot`, | `spot`, | ||||
`spreadbetting`, | `spreadbetting`, | ||||
`sr`, | `sr`, | ||||
`srl`, | `srl`, | ||||
`srt`, | |||||
`ss`, | `ss`, | ||||
`st`, | `st`, | ||||
`stada`, | `stada`, | ||||
`tech`, | `tech`, | ||||
`technology`, | `technology`, | ||||
`tel`, | `tel`, | ||||
`telefonica`, | |||||
`temasek`, | `temasek`, | ||||
`tennis`, | `tennis`, | ||||
`teva`, | `teva`, | ||||
`ua`, | `ua`, | ||||
`ubank`, | `ubank`, | ||||
`ubs`, | `ubs`, | ||||
`uconnect`, | |||||
`ug`, | `ug`, | ||||
`uk`, | `uk`, | ||||
`unicom`, | `unicom`, | ||||
`virgin`, | `virgin`, | ||||
`visa`, | `visa`, | ||||
`vision`, | `vision`, | ||||
`vistaprint`, | |||||
`viva`, | `viva`, | ||||
`vivo`, | `vivo`, | ||||
`vlaanderen`, | `vlaanderen`, | ||||
`walter`, | `walter`, | ||||
`wang`, | `wang`, | ||||
`wanggou`, | `wanggou`, | ||||
`warman`, | |||||
`watch`, | `watch`, | ||||
`watches`, | `watches`, | ||||
`weather`, | `weather`, | ||||
`zuerich`, | `zuerich`, | ||||
`zw`, | `zw`, | ||||
`ελ`, | `ελ`, | ||||
`ευ`, | |||||
`бг`, | `бг`, | ||||
`бел`, | `бел`, | ||||
`дети`, | `дети`, | ||||
`ไทย`, | `ไทย`, | ||||
`გე`, | `გე`, | ||||
`みんな`, | `みんな`, | ||||
`アマゾン`, | |||||
`クラウド`, | `クラウド`, | ||||
`グーグル`, | `グーグル`, | ||||
`コム`, | `コム`, | ||||
`中国`, | `中国`, | ||||
`中國`, | `中國`, | ||||
`中文网`, | `中文网`, | ||||
`亚马逊`, | |||||
`企业`, | `企业`, | ||||
`佛山`, | `佛山`, | ||||
`信息`, | `信息`, | ||||
`天主教`, | `天主教`, | ||||
`娱乐`, | `娱乐`, | ||||
`家電`, | `家電`, | ||||
`工行`, | |||||
`广东`, | `广东`, | ||||
`微博`, | `微博`, | ||||
`慈善`, | `慈善`, |
iriChar = letter + mark + number | iriChar = letter + mark + number | ||||
currency = `\p{Sc}` | currency = `\p{Sc}` | ||||
otherSymb = `\p{So}` | otherSymb = `\p{So}` | ||||
endChar = iriChar + `/\-+&~%=#` + currency + otherSymb | |||||
endChar = iriChar + `/\-_+&~%=#` + currency + otherSymb | |||||
otherPunc = `\p{Po}` | otherPunc = `\p{Po}` | ||||
midChar = endChar + "_*" + otherPunc | midChar = endChar + "_*" + otherPunc | ||||
wellParen = `\([` + midChar + `]*(\([` + midChar + `]*\)[` + midChar + `]*)*\)` | wellParen = `\([` + midChar + `]*(\([` + midChar + `]*\)[` + midChar + `]*)*\)` | ||||
knownTLDs := anyOf(append(TLDs, PseudoTLDs...)...) | knownTLDs := anyOf(append(TLDs, PseudoTLDs...)...) | ||||
site := domain + `(?i)(` + punycode + `|` + knownTLDs + `)(?-i)` | site := domain + `(?i)(` + punycode + `|` + knownTLDs + `)(?-i)` | ||||
hostName := `(` + site + `|` + ipAddr + `)` | hostName := `(` + site + `|` + ipAddr + `)` | ||||
webURL := hostName + port + `(/|/` + pathCont + `?|\b|(?m)$)` | |||||
webURL := hostName + port + `(/|/` + pathCont + `)?` | |||||
return strictExp() + `|` + webURL | return strictExp() + `|` + webURL | ||||
} | } | ||||