从 Qt 5.5 中的 QUrl 中删除 www.
Remove `www.` from QUrl in Qt 5.5
因此,在我程序的另一部分中,我从浏览器中读取了各种 url。
假设我有 http://www.example.com
以及 http://example.com
和 https://example.com
。对于浏览器,这三个 url 是不同的。
对我来说,只有 'base' 域 (example.com
) 很重要。
我现在正尝试从域中删除 www
,但是无法成功。我想使用提供的 QUrl 库来执行此操作,而不是检查字符串是否包含 www.
并在之后将其删除。
如您所见,这里更像是一个设计决策 ;)
这是我当前的申请。
main.cpp
#include <QApplication>
#include <QDebug>
#include <QUrl>
#include <QList>
int main(int argc, char *argv[])
{
QList<QUrl> urlList;
urlList << QUrl("http://example.com/qwe/whoami/123#123141");
urlList << QUrl("chrome://newtab/");
urlList << QUrl("favorites://");
urlList << QUrl("");
urlList << QUrl("https://www.google.de/");
urlList << QUrl("https://google.de/");
urlList << QUrl("https://www.youtube.com/watch?v=XTPGpBBqwe");
urlList << QUrl("https://youtube.com/watch?v=189273ijadzqiuwejk");
urlList << QUrl("http://raspberrypi.stackexchange.com/questions/10371/whoisthisyo");
urlList << QUrl("");
urlList << QUrl("http://localhost:3000");
urlList << QUrl("localhost:3000");
for (int i = 0; i < urlList.count(); i++) {
qDebug() << "[" << i+1 << "] " << urlList[i].host();
}
return 0;
}
感谢您的帮助!
没有开箱即用的功能。
我能想到的最好的解决办法是将 URL 的主机部分 开头的 "www."
替换掉,如果它存在的话。
请注意,您不应删除主机中甚至 URL 其余部分中出现的任何其他字符串 "www."
,因此我们检查 QUrl::host()
是否以"www."
然后从中删除这四个字符。
另请注意,从技术上讲,这会以某种方式更改主机名,从而将您引导至其他网站。 (虽然实际上,出于可用性原因,每个网站都应该提供带有或不带有 www.
子域前缀的相同内容。)此外,对于某些特殊情况,它可能会导致完全意想不到的结果,例如 www.
是甚至不是子域:域 www.com
只会导致 com
.
QUrl remove_www(QUrl url) {
QString host = url.host();
if (host.startsWith("www."))
host = host.mid(4); // = remove first 4 chars
url.setHost(host);
return url;
}
然后使用这个函数的return值:
for (int i = 0; i < urlList.count(); i++) {
qDebug() << "[" << i+1 << "] " << remove_www(urlList[i]);
}
因此,在我程序的另一部分中,我从浏览器中读取了各种 url。
假设我有 http://www.example.com
以及 http://example.com
和 https://example.com
。对于浏览器,这三个 url 是不同的。
对我来说,只有 'base' 域 (example.com
) 很重要。
我现在正尝试从域中删除 www
,但是无法成功。我想使用提供的 QUrl 库来执行此操作,而不是检查字符串是否包含 www.
并在之后将其删除。
如您所见,这里更像是一个设计决策 ;)
这是我当前的申请。
main.cpp
#include <QApplication>
#include <QDebug>
#include <QUrl>
#include <QList>
int main(int argc, char *argv[])
{
QList<QUrl> urlList;
urlList << QUrl("http://example.com/qwe/whoami/123#123141");
urlList << QUrl("chrome://newtab/");
urlList << QUrl("favorites://");
urlList << QUrl("");
urlList << QUrl("https://www.google.de/");
urlList << QUrl("https://google.de/");
urlList << QUrl("https://www.youtube.com/watch?v=XTPGpBBqwe");
urlList << QUrl("https://youtube.com/watch?v=189273ijadzqiuwejk");
urlList << QUrl("http://raspberrypi.stackexchange.com/questions/10371/whoisthisyo");
urlList << QUrl("");
urlList << QUrl("http://localhost:3000");
urlList << QUrl("localhost:3000");
for (int i = 0; i < urlList.count(); i++) {
qDebug() << "[" << i+1 << "] " << urlList[i].host();
}
return 0;
}
感谢您的帮助!
没有开箱即用的功能。
我能想到的最好的解决办法是将 URL 的主机部分 开头的 "www."
替换掉,如果它存在的话。
请注意,您不应删除主机中甚至 URL 其余部分中出现的任何其他字符串 "www."
,因此我们检查 QUrl::host()
是否以"www."
然后从中删除这四个字符。
另请注意,从技术上讲,这会以某种方式更改主机名,从而将您引导至其他网站。 (虽然实际上,出于可用性原因,每个网站都应该提供带有或不带有 www.
子域前缀的相同内容。)此外,对于某些特殊情况,它可能会导致完全意想不到的结果,例如 www.
是甚至不是子域:域 www.com
只会导致 com
.
QUrl remove_www(QUrl url) {
QString host = url.host();
if (host.startsWith("www."))
host = host.mid(4); // = remove first 4 chars
url.setHost(host);
return url;
}
然后使用这个函数的return值:
for (int i = 0; i < urlList.count(); i++) {
qDebug() << "[" << i+1 << "] " << remove_www(urlList[i]);
}