mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-21 22:24:07 +01:00
RFC Compliant URL Matching
Implemented https://gist.github.com/dperini/729294 in C++ This makes URL Validation / Matching RFC compliant.
This commit is contained in:
parent
819812c458
commit
f5438ed7a9
1 changed files with 35 additions and 6 deletions
|
@ -44,8 +44,41 @@ void MessageBuilder::appendTimestamp(const QTime &time)
|
||||||
|
|
||||||
QString MessageBuilder::matchLink(const QString &string)
|
QString MessageBuilder::matchLink(const QString &string)
|
||||||
{
|
{
|
||||||
static QRegularExpression linkRegex("[[:ascii:]]*\\.[a-zA-Z]+\\/?[[:ascii:]]*");
|
const QString urlRegExp = "^"
|
||||||
static QRegularExpression httpRegex("\\bhttps?://");
|
// protocol identifier
|
||||||
|
"(?:(?:https?|ftp)://)"
|
||||||
|
// user:pass authentication
|
||||||
|
"(?:\\S+(?::\\S*)?@)?"
|
||||||
|
"(?:"
|
||||||
|
// IP address exclusion
|
||||||
|
// private & local networks
|
||||||
|
"(?!(?:10|127)(?:\\.\\d{1,3}){3})"
|
||||||
|
"(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})"
|
||||||
|
"(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})"
|
||||||
|
// IP address dotted notation octets
|
||||||
|
// excludes loopback network 0.0.0.0
|
||||||
|
// excludes reserved space >= 224.0.0.0
|
||||||
|
// excludes network & broacast addresses
|
||||||
|
// (first & last IP address of each class)
|
||||||
|
"(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])"
|
||||||
|
"(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}"
|
||||||
|
"(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))"
|
||||||
|
"|"
|
||||||
|
// host name
|
||||||
|
"(?:(?:[a-z\\x{00a1}-\\x{ffff}0-9]-*)*[a-z\\x{00a1}-\\x{ffff0}-9]+)"
|
||||||
|
// domain name
|
||||||
|
"(?:\\.(?:[a-z\\x{00a1}-\\x{ffff0}-9]-*)*[a-z\\x{00a1}-\\x{ffff0}-9]+)*"
|
||||||
|
// TLD identifier
|
||||||
|
"(?:\\.(?:[a-z\\x{00a1}-\\x{ffff}]{2,}))"
|
||||||
|
"\\.?"
|
||||||
|
")"
|
||||||
|
// port number
|
||||||
|
"(?::\\d{2,5})?"
|
||||||
|
// resource path
|
||||||
|
"(?:[/?#]\\S*)?"
|
||||||
|
"$";
|
||||||
|
|
||||||
|
static QRegularExpression linkRegex(urlRegExp, QRegularExpression::CaseInsensitiveOption);
|
||||||
|
|
||||||
auto match = linkRegex.match(string);
|
auto match = linkRegex.match(string);
|
||||||
|
|
||||||
|
@ -55,10 +88,6 @@ QString MessageBuilder::matchLink(const QString &string)
|
||||||
|
|
||||||
QString captured = match.captured();
|
QString captured = match.captured();
|
||||||
|
|
||||||
if (!captured.contains(httpRegex)) {
|
|
||||||
captured.insert(0, "http://");
|
|
||||||
}
|
|
||||||
|
|
||||||
return captured;
|
return captured;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue