2011-05-12 60 views
0

在我开始之前,我只想说我对Regex是全新的,所以请对我温柔。一般有关正则表达式的任何意见将不胜感激。Javascript:正则表达式代码不会执行

我已经写了下面的代码

var str = "<blah blah more <b>test</b>>"; 

var reg1 = "<(?!b>)(?!/b>)"; 
str = str.replace(new RegExp(reg1), "&lt;"); 

var reg2 = ">(?<!b>)(?<!/b>)"; 
str = str.replace(new RegExp(reg2), "&gt;"); 

alert(str); 

我已经使用http://regexr.com?2toe2检查正则表达式的,它不会是我想要它是匹配任何<>,但只有当他们不html标签。 “我现在只覆盖了

现在,如果您运行此代码,http://jsfiddle.net/ashburlaczenko/JdATY/9/警报永远不会执行。我在第一次替换后发出警报,显示错误是在第二阶段。

任何人都可以帮助我吗?请记住这些正则表达式是我的第一次尝试。

预先感谢您。

编辑:

<blah blah more <b>test</b>><another <b>blah</b> blah <b>test</b>> 

应该成为

&lt;blah blah more <b>test</b>&gt;&lt;another <b>blah</b> blah <b>test</b>&gt; 

希望这是更清晰。

+0

看看这个网站:http://rubular.com,它在构建正则表达式时非常有用。 – 2013-07-28 07:52:39

回答

1
function escapeHtml($0, $1, $2, $3) 
{ 
    var result = $1 == '<' ? '&lt;' + $2 + $3 : $1 + $2 + '&gt;'; 
    return result; 
} 

str = str.replace(/([<>])([^<>]*?)(\1)/g, escapeHtml); 
str = str.replace(/^([^<]*?)>/, '$1&gt;'); 
str = str.replace(/<([^>]*?)$/, '&lt;$1'); 

这一个适用于给出的例子。

。第一替代执行以下操作:

  • 它看起来对于没有在他们之间<>如的<>重复<...<>...>
  • 第一个支架是$ 1,中间的文字是$ 2,最后一个支架是$ 3。
  • 如果$ 1是<,则$ 1被转义,否则$ 3被转义。

如果它发生在字符串的开头附近没有收到一份<第二替代逃逸>

第三个替换转义<如果它出现在字符串末尾附近,而后面没有>

+0

这是适用于这个例子,但我不是很清楚我需要什么。正则表达式应该替换所有<除<,除非它是html标签的一部分,现在我们可以说唯一有效的html标签是。这应该与>相同。希望这更清楚。 – 2011-05-12 21:24:38

+0

另外,你知道vbscript正则表达式是否可以包含后视? – 2011-05-12 21:27:30

+0

我甚至不知道vbscript是否有regexps对不起!你有一个更大的例子,所以我可以看到我的第二个错误。 – 2011-05-12 21:57:41

2

JavaScript不支持正则表达式中的后代断言。你可以用this blog post的一点点帮助来模仿它,但它还不算太好。

+1

是的,这也是一个耻辱。 – jimbojw 2011-05-12 19:37:31

+0

谢谢你的回答。你知道我怎么能写这个而不使用后顾断言? – 2011-05-12 19:38:29