javascript正则表达式字符串模板提取变量

时间:2014-04-16 13:34:15

标签: javascript regex

我正在做一个反向模板的事情,我有一个字符串,我知道用于生成它的模板,我想得到变量值。

例如: 网址:http://c.tile.osm.org/24/7881145/7385476.png

模板:http://{s}.tile.osm.org/{z}/{x}/{y}.png

我想从图块的URL中获取缩放级别({z}),在这种情况下为24.这个确切的模板网址并不总是被使用(根据使用的底图而有所不同)等等),但我总是在寻找{z}值。

3 个答案:

答案 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 /,...)包围的任何一个或两个数字的最后一次出现