2014-09-06 151 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