2014-09-06 443 views
1

我正在嘗試創建一個JavaScript程序,用鏈接替換某些文本模式。但是由於網頁上的某些網址存在模式,因此會阻止網址鏈接。正則表達式來排除URL的

我特別希望排除模式,如果它包含在一個URL中,例如這裏是我當前的Regex代碼。

$els.replaceText(/(\bX00[A-Z0-9]{7}\b)/gi, '<span class="context context_ident">$1<\/span>'); 

一些示例文本:

項:X00132BhJk

www.domain.com/X00132BhJk

www.domainsearch.com/search?ident=X00132BhJk

X00132BhJk

X00132BhJk

斜體參考文獻應選擇和更換然而包含域內應該不是引用。我遇到的問題是參考。

最初我嘗試了\sX00[A-Z0-9]{7}\s,但是當參考出現在頁面的最左側(句子中的第一個單詞)時,它沒有被選中。同樣如此,它不會選擇是否遵循句號或冒號先於。

有沒有一種方法可以排除URL的排除/?和=是否是直接前面的字符,但在所有其他情況下選擇?

+0

問題是,'X00132BhJk1是Intranet內的完全有效的URL,例如(通過防火牆內的該名稱指定主機)。編寫用於驗證URL的正則表達式非常困難。您可以做的最好的辦法是找到一些無效的案例,例如包含無效字符的網址,或者以明顯的方式變形。 – 2014-09-06 13:37:48

回答

1

捕捉(^start| OR [^/?=]negated character class的那些,也不能出現之前)

/(^|[^\/?=])(\bX00[A-Z0-9]{7}\b)/gi 

並將其替換:'$1<span class="context context_ident">$2</span>'

而且see fiddle; SO Regex FAQ;

+1

完美的這個問題修正了一個輕微的編輯/(^ | [^ /?=])改爲/(^ | [^ \ /?=]),因爲/正在過早地轉義正則表達式聲明。我已經測試過這個,它工作完美 – Bobstefano 2014-09-09 15:13:11

+0

@Bobstefano偉大的,適合你:)相應地更新了答案。 – 2014-09-09 16:51:28

0
(?!^www.*?X00[A-Z0-9]{7}.*$)^(.*?)(X00[A-Z0-9]{7})(.*)$ 

試試這個。

替換爲。

\1<span class="context context_ident">$1<\/span>\2 

查看演示。

http://regex101.com/r/oC3nN4/7

加入米標誌以及用於多線匹配如我已經使用錨。

0

你可以用非捕獲括號(?:)嘗試,你的情況(?:[^/?=]|^)

replace(/(?:[^/?=]|^)(\bX00[A-Z0-9]{7}\b)/gi, '<span class="context context_ident">$1<\/span>'); 

Example

+0

這看起來像會吃掉URL中的'/','?'或'=';因爲它沒有捕獲並不意味着它不是被替換的比賽的一部分 – 2014-09-06 12:51:50

+0

我首先想到的是相同的,但小提琴表明相反。 – Volune 2014-09-06 12:54:16

+0

對不起,我在腦海中弄錯了方向;這是一個不屬於這些角色的比賽;注意':'如何消失; http://jsfiddle.net/jqcwmu0j/1/ – 2014-09-06 13:01:08

0

你不需要逃脫FRONTSLASH在更換部件收盤span標籤。

正則表達式:

^((?:(?![\/?]).)*)(X00[A-Z0-9a-z]{7})(.*)$ 

替換字符串:

$1<span class="context context_ident">$2</span>$3 

DEMO