2012-03-30 35 views
1

我从textarea(除了简单的文本可能包含html标记)获取内容,并试图解析它并用字符串替换所有“[File:#xx#]”的出现包含在一个数组中。 因此,可以说textarea的内容在var html
我做到以下几点:javascript正则表达式 - 全局替换问题

<img src="[File:#111#]" alt="image1" /> 
<img src="[File:#222#]" /> 

但当有2个元素女巫之间没有断行与[File:#xx#]值都属性:当内容的文本区域都是这样

html = html.replace(/\[File:#(.*)#\]/g, 
        function($0, $1){ return furls[$1]; }); 

一切工作正常,那么问题就出现了。
因此,考虑到这是textarea的值:

<img src="[File:#111#]" alt="image1" /><img src="[File:#222#]" /> 

好像它matces第一IMG的[File:#111#但关闭它不与第一支架,Rathen市的比第二的。所以,被取代的是所有这些:
#]" alt="image1" /><img src="[File:#222

我的正则表达式有什么问题?我怎样才能防止这种先行发生,并停止在第一个左括号?

在此先感谢。

回答

1

那么你的情况下,正确的正则表达式是:

/[File:#[\w]+#]/g 

为什么会出现这种情况?

因为您正则表达式:

的。匹配任何字符,除了换行符,如果dotall为false。

*匹配0个或更多前面的标记。这是一个贪婪的匹配,并且会在满足下一个标记之前匹配尽可能多的字符。

而且在正则表达式我提供:

的\ w匹配任何单词字符(字母数字&下划线)。

+0

非常感谢Bogdan的回复。对于我目前需要的东西就足够了,但是如果我需要支持任何字符,如'[File:#http://test.com/file1?a = 1&b = 2#]' – CrisDeBlonde 2012-03-30 14:44:37

+1

如果您想添加其他字符在你的搜索中,你可以得到如下的正则表达式:/[File:#[\w=&?/.]+#]/g这将与你在评论 – 2012-03-30 14:46:44

+0

cool中提供的例子相匹配!再次感谢广泛的帮助! – CrisDeBlonde 2012-03-30 14:48:42

1

问题是,它抓取所有从第一个#符号到最后一个符号,因为您使用的是(。*),它匹配所有字符。试试这个,它将匹配的部分限制为只是数字:

html = html.replace(/\[File:#([0-9]*)#\]/g, 
       function($0, $1){ return furls[$1]; }); 
+0

感谢您答复罗素。文件ID也可以包含字母,所以我选择了波格丹的答案。再次感谢您的困扰:) – CrisDeBlonde 2012-03-30 14:47:01