我从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
我的正则表达式出了什么问题?我怎样才能阻止这种前瞻发生并在第一个结束时停止?
提前致谢。
答案 0 :(得分:1)
你的案例的正确正则表达式是:
/[File:#[\w]+#]/g
为什么会这样?
因为你的正则表达式:
。匹配任何字符,如果dotall为false,则除了换行符。
*匹配前面标记的0或更多。这是一个贪婪的匹配,在满足下一个标记之前将匹配尽可能多的字符。
在我提供的正则表达式中:
\ w匹配任何单词字符(字母数字和下划线)。
答案 1 :(得分:1)
问题在于它抓住了从第一个#符号到最后一个符号的所有内容,因为你正在使用(。*),它匹配所有字符。请尝试使用此选项,将匹配的部分限制为仅数字数字:
html = html.replace(/\[File:#([0-9]*)#\]/g,
function($0, $1){ return furls[$1]; });