javascript正则表达式 - 全局替换问题

时间:2012-03-30 14:20:41

标签: javascript regex

我从textarea获取内容(除了简单的文本可能包含html标记),并尝试解析它并用数组中包含的字符串替换所有出现的“[File:#xx#]”。 所以,让我们说textarea的内容是var html 我做了以下事情:

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

当文本区域的内容如下时,一切正常:

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

但如果2个元素之间没有换行符,其属性值为[File:#xx#],则会出现问题。
所以,鉴于这是textarea的价值:

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

似乎它匹配第一个img的[File:#111#,但不是用第一个支架关闭它,而不是第二个支架。所以,取而代之的是这一切:
#]" alt="image1" /><img src="[File:#222

我的正则表达式出了什么问题?我怎样才能阻止这种前瞻发生并在第一个结束时停止?

提前致谢。

2 个答案:

答案 0 :(得分:1)

你的案例的正确正则表达式是:

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

为什么会这样?

因为你的正则表达式:

  

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

     

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

在我提供的正则表达式中:

  

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

答案 1 :(得分:1)

问题在于它抓住了从第一个#符号到最后一个符号的所有内容,因为你正在使用(。*),它匹配所有字符。请尝试使用此选项,将匹配的部分限制为仅数字数字:

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