也许有人可以给我一个暗示......
我有以下代码并在javascript(node.js)中遇到奇怪的行为:
var a = "img{http://my.image.com/imgae.jpg} img{http://my.image.com/imgae.jpg}"
var html = a.replace(/img\{(.*)\}/g, '<img src="$1" class="image">');
//result: <img src="http://my.image.com/imgae.jpg" class="image"">
正如您所看到的,字符串中的出现(标记事物)被img标记取代,其中包含源代码。
但现在有些奇怪了。在标记中可能有几个img {src}
类型的元素var a = "img{http://my.image.com/imgae.jpg} some text between img{http://my.image.com/imgae.jpg}"
var html = a.replace(/img\{(.*)\}/g, '<img src="$1" class="image">');
//result: <img src="http://my.image.com/imgae.jpghttp://my.image.com/imgae.jpg" class="image"">
结果很奇怪。在$ 1中存储和累积所有匹配...并且只有一个图像标记。
我很困惑......
答案 0 :(得分:1)
使用它来停止在第一个右手括号。
var html = a.replace(/img{([^}]*)}/g, '<img src="$1" class="image">');
答案 1 :(得分:1)
尝试:a.replace(/img\{(.*?)\}/g, '<img src="$1" class="image">');
我发现添加?
会使正则表达式非贪婪here
答案 2 :(得分:0)
我认为你了解这是如何运作可能更重要。 .*
可能是一个危险的正则表达式,如果你不明白它会做什么,因为它是贪婪的并且会消耗尽可能多的东西,并且一些短信会警告它。
因此,如果您分解正则表达式,您会发现img\{
部分与字符串(.*)
的第一部分匹配http://my.image.com/imgae.jpg} some text between img{http://my.image.com/imgae.jpg
,最终的}
与结束时匹配}
因为这是与表达式匹配的最大字符串。
最佳解决方案是使用([^}]*)
,它匹配}
以外的任何内容,因为您知道图像{}
之间的任何内容都不会是结束括号。
您可以测试正则表达式以查看匹配内容:
var reg = /img\{(.*)\}/g
var a = "img{http://my.image.com/imgae.jpg} img{http://my.image.com/imgae.jpg}"
var groups = a.match(reg)
// we can see what the first group matched
// groups[0] === "http://my.image.com/imgae.jpg} img{http://my.image.com/imgae.jpg"