跳过JavaScript正则表达式中的前面的html实体

| 我正在使用正则表达式片段将笑脸解析为图像,并遇到分号的问题。例如,像;)这样的笑脸变成WINK图标,与
/;-?\\)/g
并在大多数情况下有效。但是像\“)这样的文本也匹配\\ WINK,因为引号实际上是html实体(
" => &quotWINK
)。 我尝试为正则表达式添加贪婪的非捕获匹配前缀,以丢弃实体中的分号:
(?:"|&|<|>|'|')?
但是结果模式仍然与应跳过的“ 3”中的分号相匹配,因为它会回溯以满足非可选的后半部分。我还意识到其他合法比赛仍然存在问题,例如EVIL:
>:) => >:)
。 因此,我真正需要的是对前面的html实体缺少分号的否定:
(?!&quot|&amp|&lt|&gt|&apos|&#039)
但是它仍然匹配,我不确定为什么。 仍然可以退回的火柴是理想的选择,而无需进一步检查,可以将其批发更换,但我愿意提出建议。不合适的方法是首先解析html实体,因为有时它们是必需的和/或合法笑脸的一部分(例如EVIL)。 编辑(一些Google食物): 我发现(且Bryan在下面也指出),零宽度正向后视ѭ6would可以按需工作(而不是零宽度负向前视
(?!regex)
)。 根据regular-expressions.info,后者“仅在前瞻内的正则表达式不匹配时才能成功”,听起来不错,但无论如何该节都是可选的,则不会。 相比之下,前者“如果可以匹配先行内的图案,则匹配到某个位置,以该位置结束”,这虽然不是很清楚,但是可以解决问题。由于匹配使用后向匹配,因此无法回溯以满足正则表达式的后一部分。 因此,完整的正则表达式如下所示:
/(?<!&quot|&amp|&lt|&gt|&apos|&#039);-?\\)/g
并且与以下内容匹配:
;) => WINK
blah;) => blahWINK
&quot;;) => &quot;WINK
,但失败了:
&quot;)
但是它仍然与ѭ13匹配,因此更多的调整将是理想的(例如,另外匹配分号代替“与”号,如果这样不会导致其他带有实体的笑脸中断)。无论如何,人们在聊天中输入html实体的可能性很小。 两种方法都将“足够好”-除了javascript不支持负向后看。但是为了其他正则表达式的实现,值得解释。     
已邀请:
        首先,您可以只检查;-)前面的空格字符,因此这是一个更简单的选项。但是,如果您确实想在JavaScript中实现否定的后向隐藏(存在于多种正则表达式中,而在JS中则不存在),则可以执行以下操作:
var text = \"& &amp; &amp;-) ;-) test;-)\";
var ENTITIES_REGEX = /(&quot|&amp|&lt|&gt|&apos|&#039)?;-\\)/g;

var result = text.replace(ENTITIES_REGEX, function(fullMatch, backref1) {
  // Ignore if there is a backreference by returning the unaltered
  // match, otherwise return WINK
  return (backref1 ? fullMatch : \'WINK\');
});

// result equals \"& &amp; &amp;-) WINK testWINK\"
这是一个例子。     

要回复问题请先登录注册