使用正则表达式的 Google 地图链接验证

Posted

技术标签:

【中文标题】使用正则表达式的 Google 地图链接验证【英文标题】:Google Maps link validation using Regex 【发布时间】:2013-01-21 15:48:02 【问题描述】:

我只想检查那个链接是不是谷歌地图链接

例如:

var urls =[
    /// correct urls
    "https://www.google.com/maps",
    "https://www.google.fr/maps",
    "https://google.fr/maps",
    "http://google.fr/maps",
    "https://www.google.de/maps",
    "https://www.google.com/maps?ll=37.0625,-95.677068&spn=45.197878,93.076172&t=h&z=4",
    "https://www.google.de/maps?ll=37.0625,-95.677068&spn=45.197878,93.076172&t=h&z=4",
    "https://www.google.com/maps?ll=37.0625,-95.677068&spn=45.197878,93.076172&t=h&z=4&layer=t&lci=com.panoramio.all,com.google.webcams,weather",
    "https://www.google.com/maps?ll=37.370157,0.615234&spn=45.047033,93.076172&t=m&z=4&layer=t",

    "https://www.google.com/maps?ll=37.0625,-95.677068&spn=45.197878,93.076172&t=h&z=4",
    "https://www.google.de/maps?ll=37.0625,-95.677068&spn=45.197878,93.076172&t=h&z=4",
    "https://www.google.com/maps?ll=37.0625,-95.677068&spn=45.197878,93.076172&t=h&z=4&layer=t&lci=com.panoramio.all,com.google.webcams,weather",
    "https://www.google.com/maps?ll=37.370157,0.615234&spn=45.047033,93.076172&t=m&z=4&layer=t",

    /// error urls
    "https://www.google.com/",
    "https://zzz.google.com/maps",
    "https://www.google.com/+",
    "httpsxyz://www.google.com/maps",
    "http://www.anotherdomain.com/+"
    ];

我对 Regex 很不满意,并尝试使用 javascript Regex Generator,但对我来说仍然很难。

我只有..

Reg = /^http\:\/\/|https\:\/\/|www\.google$/;

它失败了! :(

但我为大家做了一个现场测试:http://jsbin.com/onuyux/1/edit?javascript,live


已编辑:2

在我得到 @joel harkes@dan1111 的帮助后,我得到了正则表达式

/^https?\:\/\/(www\.)?google\.[a-z]+\/maps\b/

这只是 google.TLD/maps 的正则表达式,那么 maps.google.TLD 呢?

我只想验证 Google 地图网址和这种方式的网址(看图片)

如果可能我想验证是否设置了地址或经纬度(使用 liq 参数检查?)(例如,不仅是“maps.google.com”。 .)

更新列表+代码:

/// correct urls
"https://www.google.com/maps?ll=37.0625,-95.677068&spn=45.197878,93.076172&t=h&z=4",
"https://www.google.de/maps?ll=37.0625,-95.677068&spn=45.197878,93.076172&t=h&z=4",
"https://www.google.com/maps?ll=37.0625,-95.677068&spn=45.197878,93.076172&t=h&z=4&layer=t&lci=com.panoramio.all,com.google.webcams,weather",
"https://www.google.com/maps?ll=37.370157,0.615234&spn=45.047033,93.076172&t=m&z=4&layer=t",
"https://maps.google.com/maps?q=New+York,+NY,+USA&hl=no&sll=19.808054,-63.720703&sspn=54.337928,93.076172&oq=n&hnear=New+York&t=m&z=10",
"https://www.google.com/maps?q=New+York,+New+York,+USA&hl=no&ll=40.683762,-73.925629&spn=0.708146,1.454315&sll=41.47566,-72.026367&sspn=11.190693,23.269043&oq=new&hnear=New+York&t=m&z=10",

/// error urls
"https://www.google.com/",
"https://zzz.google.com/maps",
"https://www.google.com/+",
"httpsxyz://www.google.com/maps",
"http://www.anotherdomain.com/+",
"http://maps.google.com/",
"http://google.com/maps",
"http://google.de/maps",
"?q=New+York,+New+York,+USA&hl=no&ll=40.683762,-73.925629&spn=0.708146,1.454315&sll=41.47566,-72.026367&sspn=11.190693,23.269043&oq=new&hnear=New+York&t=m&z=10",
"&sll=41.47566,-72.026367&sspn=11.190693,23.269043&oq=new&hnear=New+York&t=m&z=10"

现场测试:http://jsbin.com/onuyux/25/edit?javascript,live

【问题讨论】:

+1 用于实时测试。很有帮助。 根据您的评论“这是仅适用于 google.TLD/maps 的正则表达式,那么 maps.google.TLD”,javascript 不支持后视,因此您需要专门为“maps.google.com”等创建另一个不需要匹配结尾的“/maps”的正则表达式。创建第二个表达式后,检查它们两个,如果一个匹配,那么很好,如果没有匹配,那么它不是。 ^^ 根据最后一个现场示例,这是因为正则表达式不允许 (www\.|maps\.) 可以修复该行,但如果 url 是“maps.google.com/? q=" (如果问号后面的所有内容都与您的其他条件匹配,则有效。)。如果你有“maps.google”,那么最后就不需要“/maps”,这是使用 JS 以外的语言进行反向引用的地方。如果你有 '(www\.|maps\.)' 然后也使 '/maps' 有条件,那就太灵活了 - 因此你需要与两个正则表达式进行比较以匹配所有可能的 url。跨度> 我会保留你原来的正则表达式,然后添加一个新的正则表达式 (maps\.)? 而不是 'www.',然后在 TLD 后面加上 \/(maps)? 别忘了google.co.uk这样的域名。 【参考方案1】:

完成dan1111的回答,这是一个匹配指定域并检查是否设置了 ll GET 变量的模式:

Reg = /^https?\:\/\/(www\.)?google\.[a-z]+\/maps\/?\?([^&]+&)*(ll=-?[0-9]1,2\.[0-9]+,-?[0-9]1,2\.[0-9]+|q=[^&+])+($|&)/;

我无法测试它(jsbin 已关闭),但它应该匹配任何包含至少一个 ll 或 q 参数的 url。

编辑

我添加了地图。子域并修复了一个小错字。在q= 之后,+ 应该在字符类之外,让它重复:q=[^&]+ 而不是q=[^&+]。 话虽如此,这是您的正则表达式:

Reg = /^https?\:\/\/(www\.|maps\.)?google\.[a-z]+\/maps\/?\?([^&]+&)*(ll=-?[0-9]1,2\.[0-9]+,-?[0-9]1,2\.[0-9]+|q=[^&]+)+($|&)/;

EDIT2

要接受 google.co.uk 样式的域,请使用以下正则表达式。

Reg = /^https?\:\/\/(www\.|maps\.)?google(\.[a-z]+)1,2\/maps\/?\?([^&]+&)*(ll=-?[0-9]1,2\.[0-9]+,-?[0-9]1,2\.[0-9]+|q=[^&]+)+($|&)/;

希望它现在能覆盖所有的网址。

【讨论】:

错误:https://maps.google.com/maps?q=New+York,+NY,+USA&hl=no&sll=19.808054,-63.720703&sspn=54.337928,93.076172&oq=n&hnear=New+York&t=m&z=10(例如)q参数? + 现在在我的列表中添加了带有q 参数的链接:D jsbin.com/onuyux/17/edit?javascript,live @l2aelba 澄清一下,您要检查是否设置了 ll 和 q 或其中之一? 所有工作链接 :D 一些用户按名称添加或相同用户指向位置,如 long-lat :D 您的正则表达式有效,但您也可以添加 q 参数吗? @l2aelba 不,不是。您创建的正则表达式将匹配https?\:\/\/(www\.)?google\.[a-z]+\/maps\/?\?([^&]+&)*|(ll=-?[0-9]1,2\.[0-9‌​]+,-?[0-9]1,2\.[0-9]+(ll=-?[0-9]1,2\.[0-9‌​]+,-?[0-9]1,2\.[0-9]+|q=[^&+])+($|&)。我更新了我的答案以使其更好:)【参考方案2】:
(https|http)://(www\.|)google\.[a-z]+/maps

-> 带斜线:/(https|http):\/\/(www\.|)google\.[a-z]+\/maps/

该正则表达式只选择好的 url 而不是坏的,但不检查 enny \GET 变量

您可以在http://regexpal.com/ 或这里进行测试http://jsbin.com/onuyux/4

你可以在前面加^来测试它是否是字符串的开始

【讨论】:

非常感谢:D,您的正则表达式是如此简单:D 工作! jsbin.com/onuyux/5/edit?javascript,live 您可以使用(https|http)://(www\.|)google\.[a-z]+/maps($|\?) 来检查它是否是字符串结尾或后跟一个?【参考方案3】:

这是一个适用于您的测试数据的简单正则表达式:

Reg = /^https?\:\/\/(www\.)?google\.(com|fr|de)\/maps\b/;

但是,您可能应该退后一步,多考虑一下您要做什么。您在这里有两个不同的问题:

验证某些内容是有效的 URL(我假设您需要这样做,因为您的示例之一是无效的 URL)。 验证网址是否为 Google 地图网址。

如果您想要一个稳健的解决方案,我建议您分两步完成。先判断网址是否有效,再看是否为谷歌地图网址。

第一部分本身就相当复杂,但许多其他部分之前已经处理过。如果您搜索“Javascript URL 验证”,您会看到许多问题和许多建议的答案。我建议以 this one 为起点,但我没有任何在 Javascript 中执行此操作的个人经验。

对于第二部分,您必须准确确定 Google 地图 URL 的外观。您在上面给出了一些示例,但它们显然是可能性的一个子集。你想做到多详尽?您是否也需要验证参数是否有效?这可能是一项艰巨的任务。

【讨论】:

对不起,我失败了。不仅(com|fr|de),而且只有maps,而不是mapsz(例如) 我现在得到了:/^https?\:\/\/(www\.)?google\.[a-z]+\/maps\b/ 谢谢【参考方案4】:

这应该可以解决问题

Reg = /^https?\:\/\/((www|maps)\.)?google\.[a-z]+\/maps\/?\?([^&]+&)*(s?ll=-?[0-9]1,2\.[0-9]+,-?[0-9]1,2\.[0-9]+|q=[^&+])+($|&)/;

可以在http://jsbin.com/onuyux/36进行测试

【讨论】:

以上是关于使用正则表达式的 Google 地图链接验证的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式在 JS 中验证 url [重复]

使用 mysql 正则表达式验证我的 google bigquery 数据库中的电子邮件地址

正则表达式验证不适用于 Google Chrome Android 应用程序,但适用于 Chrome 浏览器 - PC

PHP:正则表达式,如何验证 android 和 ios 深层链接 URI

使用正则表达式验证 DNS [重复]

使用 Beautiful Soup 提取链接的等效正则表达式