2012-03-30 36 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