2010-07-13 77 views
2

我現在有這個,(我在這裏找到了代碼)。JavaScript拒絕我所有的RegExs,怎麼回事?

 var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; 
    someText.replace(exp, "<a href='$1'>$1</a>"); 

它將取代在someText任何http://URL一個適當<a href>

,但我也需要它來搭配WWW。沒有http。我在RegEx Lib上找到了這個RegEx。

((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)? 

並嘗試了在正則表達式檢查現場,http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp

據我想要的字符串相匹配。但是,當我把它放到我的exp變量中時,JavaScript會炸燬並導致錯誤。

我甚至嘗試將它作爲一個新的RegExp新的像這樣。

var exp = new RegExp(((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?); 

但同樣的事情發生。

任何想法我做錯了什麼?

感謝, 鋼鈑

+0

你可能需要逃脫你的逃生。也許甚至多次。 – 2010-07-13 08:45:53

+2

你的問題與jQuery毫無關係。您使用的語言是JavaScript,jQuery是一個用JavaScript編寫的框架,用於幫助DOM操作。 – 2010-07-13 08:54:03

+0

@Andy E但我使用JQuery更具說服力。對於我所知道的,可能有一些JQuery函數很容易做到這一點。通過說明JQuery你知道我在使用JavaScript,但是如果我用JavaScript標記它,你不知道是否使用JQuery。 – 4imble 2010-07-13 09:15:29

回答

6

相信RegExp的構造函數採用一個字符串作爲參數,在這裏看到:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp

所以只要把引號的正則表達式,它應該工作的罰款。

var exp = new RegExp("((http\\://|https\\://|ftp\\://)|(www.))+(([a-zA-Z0-9\\.-]+\\.[a-zA-Z]{2,4})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\\?\\.'~]*)?"); 
someText.replace(exp, "<a href='$1'>$1</a>"); 
+2

他還需要「逃脫」逃避角色。例如,無論你看到「\。」,你實際上都需要「\\。'。 – 2010-07-13 08:51:43

+0

將我的原始表達式放入新的RegExp(「」);導致它不再工作。但是我的新註冊表現在做了一些事情(不是我期待的,但是我懷疑另一個問題)。我的第一個表達式和第二個表達式之間有什麼區別,我需要將它們放入新的RegExp()中? – 4imble 2010-07-13 08:57:03

+1

@Kohan第一個是正則表達式 - 正則表達式用'/ regex /'兩個斜線括起來。您不必在正則表達式文字中逃避反斜槓 - 但是您應該避開前斜槓,因爲它是分隔符。第二個是正則表達式構造函數,它將模式作爲一個字符串,因此不需要分隔符 - 您也不應該使用正斜槓。但是作爲一個字符串,你必須避開它的反斜槓 – Amarghosh 2010-07-13 09:03:59

0
在JavaScript

正則表達式必須用斜槓 '/' 所包圍,所以它看起來像

var expr = /pattern/flags; 

你的corect方式是

var exp = /((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?/; 

如果您使用構造新的RegExp(),將其稱爲表格

var expr = new RegExp(pattern [, flags]); 

這裏的圖案和標誌串PARAMS

var exp = new RegExp("((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?"); 
+0

你忘了逃避正則表達式中的正斜槓和字符串版本中的反斜槓。 – 2010-07-13 15:21:23

2

好吧,你已經得到了JavaScript語法理順,現在讓我們來談談正則表達式語法。冒號(:)沒有特殊含義,所以沒有必要逃避它。點(.)和問號(?)通常具有特殊的含義,但不會出現在字符類(即方括號內)中時。

連字符(-確實有一個字符類特殊的意義:它形成了範圍,像[a-z][0-9]。如果要在字符類中包含文字連字符,可以使用反斜槓將其轉義或將其放在列表的開頭或末尾。例如,在[a-zA-Z0-9\.-]中,最後一個連字符與連字符相匹配,而其他三個用於形成範圍。 (點前面的反斜槓是不必要的,但它不會損害任何東西。)

現在看看[a-zA-Z0-9%:/-_\?\.'~]?.前面的反斜槓只是混亂,但是foruth連字符是一個真正的問題。它形成一個從/開始並以_結尾的範圍;如果你看一個ASCII字符映射表,你會看到它包含的數字0-9和大寫字母A-Z,加上

/:;<=>?@[\]^_

......顯然不是作者的意圖。在那個正則表達式中還有很多不必要的分組和重複的代碼,你是否真的需要匹配IP地址呢?道義是:不要相信您在RegExLib.com上找到的任何內容。

+0

感謝您的解釋。 +1。看起來我應該閱讀製作自己的正則表達式。 – 4imble 2010-07-14 09:48:27