在javascript中,我有一个像这样的HTML块:
<h2>{title}</h2>
<p><a href="{url}">{content}</a></p>
我正在尝试使用正则表达式“匹配”来吐出所有{item}的数组。所以我的输出应该如下:
['title', 'url', 'content']
我已经达到了:
var pattern = new RegExp("\{[a-zA-Z]+\}+");
var match = pattern.exec("{Sample} bob {text}");
但它只返回第一个标签。
这超出了我的正则表达能力。有人可以帮忙吗?
干杯!
答案 0 :(得分:7)
您需要使用全局标志创建模式:
var pattern = new RegExp("\{[a-zA-Z]+\}", "g");
或:
var pattern = /\{[a-zA-Z]+\}/g;
然后你可以在字符串上调用match()方法来获得匹配列表:
var matches = "{Sample} bob {text}".match(pattern);
答案 1 :(得分:2)
我想你想要:
var pattern = new RegExp("\{[a-zA-Z]+\}+", "g");
第二个选项是一个标志,告诉它搜索整个字符串并返回所有匹配。
有关详细信息,请参阅:http://www.evolt.org/article/Regular_Expressions_in_JavaScript/17/36435/。
答案 2 :(得分:1)
就像我喜欢推出自己的RegExp(你真的只需要全局标志)一样,你看过prototype templates,Trimpath JST还是其他类似的东西?
因为可能滚动自己将不像上面的示例那样有效地重复使用。 EG:
String.prototype.template = function (obj) {
return this.replace(/{([^{}]+)}/g,
function (full, word) {
return((typeof obj[word]==='string'||typeof obj[word]==='number')?obj[word]:full);
}
);
};
"The {adj1} {adj2} {noun}.".template({adj1: 'lazy',adj2: 'brown', noun: 'dog'})
==> "The lazy brown dog."
每次运行你的正则表达式,而我相信原型模板基本上只执行一次。
答案 3 :(得分:1)
你试过这个吗?
<script>
var text = '<h2>{title}</h2>\n<p><a href="{url}">{content}</a></p>';
var regex = /\{[a-z]+\}/ig;
var result = text.match(regex);
for (var i = 0; i < result.length; i++) {
console.debug(i + ". " + result[i]);
}
/*
gives:
0. {title}
1. {test}
2. {url}
3. {content}
*/
</script>
答案 4 :(得分:0)
@grieve - 很好的提示,它仍然只返回第一个。我会一直玩。
@litb - getElementsByTagName只会返回标签。我需要大括号中包含的自定义元素。 getElementsByTagName不会返回那些。正确?
答案 5 :(得分:0)