我正在做一个反向模板的事情,我有一个字符串,我知道用于生成它的模板,我想得到变量值。
例如:
网址:http://c.tile.osm.org/24/7881145/7385476.png
模板:http://{s}.tile.osm.org/{z}/{x}/{y}.png
我想从图块的URL中获取缩放级别({z}
),在这种情况下为24.这个确切的模板网址并不总是被使用(根据使用的底图而有所不同)等等),但我总是在寻找{z}
值。
答案 0 :(得分:1)
您可以使用正则表达式捕获值。 This thread与您的情况类似,这将是您的解决方案:
var myString = "http://c.tile.osm.org/24/7881145/7385476.png";
var myRegexp = /http:\/\/[A-z]\.tile\.osm\.org\/([0-9]+)\/([0-9]+)\/([0-9]+)\.png/;
var match = myRegexp.exec(myString);
alert(match[1]); // 24
这是小提琴:http://jsfiddle.net/2sx4t/
修改强>:
在您的评论之后,我可以快速为您提供最灵活的代码:http://jsfiddle.net/2sx4t/4/
var myString = "http://c.tile.osm.org/24/7881145/7385476.png";
var myTemplate = "http://{s}.tile.osm.org/{z}/{y}/{x}.png";
var myString2 = "//tiles.arcgis.com/tiles/c/arcgis/rest/services/TimeZones/MapServer/tile/223774/24/2636";
var myTemplate2 = "//tiles.arcgis.com/tiles/{s}/arcgis/rest/services/TimeZones/MapServer/tile/{x}/{z}/{y}";
var z = extractToken(myTemplate, myString, '{z}');
alert(z); // 24
var z2 = extractToken(myTemplate, myString, '{z}');
alert(z2); // 24
此代码中的技巧是使用template.indexOf(m)
来查找令牌顺序和String.replace()
以生成相应的 RegExp 的组合。< / p>
请注意,我在myTemplate2
中拖拽了令牌的顺序,并且它会起作用。
不要期待来自 RegExp 的魔法,魔法在我们的大脑中; - )
带有地图返回的奖励,与其他令牌无关:http://jsfiddle.net/2sx4t/8/
答案 1 :(得分:1)
看起来blint可能会打败我,但基本上你要做的就是从你的模板中生成一个正则表达式并执行它:
function zFromTemplate(str, template) {
var sr = template.replace("?", "\\?")
.replace(/\{[^z]\}/g, ".*?")
.replace(/\{z\}/g, "(.+)");
var rex = new RegExp(sr),
parts = rex.exec(str);
if(parts) {
return parts[1];
}
return null;
}
这是一个codepen demonstrating it's use。如果没有别的,它比最初接受的答案更简洁。
答案 2 :(得分:0)
好吧,如果您确定{z}参数是网址中唯一的1位或2位数字元素,您可以尝试使用regexp:
var myRegexp = /.*\/([0-9]{1,2})\/.*/;
这将匹配用两个斜杠(/ 1 /,/ 24 /,...)包围的任何一个或两个数字的最后一次出现