使用正则表达式的 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 地图网址和这种方式的网址(看图片)
如果可能我想验证是否设置了地址或经纬度(使用 li
或 q
参数检查?)(例如,不仅是“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 地图链接验证的主要内容,如果未能解决你的问题,请参考以下文章
使用 mysql 正则表达式验证我的 google bigquery 数据库中的电子邮件地址
正则表达式验证不适用于 Google Chrome Android 应用程序,但适用于 Chrome 浏览器 - PC