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