当使用Regexp for restrict将HTML实体输入文本区域时,我遇到了问题。
我使用这个Regexp - /<(.|\n)*?>/g;
来限制HTML实体,它对我来说很好,但是当我声明全局变量并使用这个regexp时,它给了我不同的 - 不同的测试用例(真/假)时间。
有一个Jsfiddle - Try This
当你第一次点击“提交”按钮时,你会得到“真实”,第二次你得到相同内容的“假”。
任何人都能告诉我为什么我的正则表达式会返回不同的 - 每次在全局声明它时会有不同的测试用例吗?
感谢您的帮助...... !!!
答案 0 :(得分:7)
这是因为您在RegExp上使用g
标志。
如果您需要使用g
,您可以在函数中定义正则表达式,以便每次都获得一个新的
function CheckContent(){
var RegForRestrictHtmlTags2 = /<(.|\n)*?>/g;
$('#txtJobDesc').val("AAAAAAAA<fff>AAAAAA");
alert(RegForRestrictHtmlTags2.test($('#txtJobDesc').val()));
}
使用g
标记时,您可以使用.test
在主题字符串中查找多个匹配项。对于每个唯一匹配,.test
将继续返回true
。一旦.test
返回false,它将有效地“重置”到起始位置。
考虑这个简单的例子
> var re = /a/g;
undefined
> var str = 'aaaaab';
undefined
> re.test(str); // first a
true
> re.test(str); // second a
true
> re.test(str); // third a
true
> re.test(str); // fourth a
true
> re.test(str); // fifth a
true
> re.test(str); // no more a's; reset
false
> re.test(str); // back to first a
true
答案 1 :(得分:4)
问题是您在g
字面上使用RegExp
标记。解决方案是删除g
标志。
根据RegExp.test()
(强调我的)的文件:
与
exec
一样(或与之结合使用),在同一个全局正则表达式实例上多次调用的test
将超过上一个匹配。
第一次调用test
后,lastIndex
对象RegExp
的{{1}}属性会更新。索引用作第二次调用/<(.|\n)*?>/g
的偏移量。由于模式不再匹配,第二个调用返回test
,false
重置为0.您可以在此{{3}中看到正在更改的正则表达式的lastIndex
属性}}
删除lastIndex
标志将导致引擎忽略g
属性。
我在JSFiddle中详细描述了lastIndex
的行为(RegExp.exec
也是如此)。