如果您主要关心的是强制单色显示以便表情符号不会从文本中脱颖而出,那么 CSS 过滤器,无论是单独使用还是与 Unicode 变体选择器结合使用,都可能是您想要的。
p.gscale {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
}
a {
color: #999;
-webkit-filter: grayscale(100%) sepia(100%) saturate(400%) hue-rotate(170deg);
filter: grayscale(100%) sepia(100%) saturate(400%) hue-rotate(170deg);
}
<p class="gscale">You've now got emoji display on 🔒lockdown🔒.</p>
<p>External Link: <a href="https://knowyourmeme.com/memes/party-hard">celebrate 🎉</a></p>
与变体选择器不同,表情符号的呈现方式无关紧要,因为 CSS 过滤器适用于所有内容。(我使用它们对已修改为指向 Wayback Machine 的超链接上的 PNG 格式“链接类型”图标进行灰度处理。)
请注意警告。您不能在子元素中覆盖父元素的过滤器,因此该技术不能用于对段落进行灰度化,然后对其中的链接重新着色。😢
...不过,它对于您要使整个内容成为超链接或禁止其中包含丰富标记的情况很有用。(例如标题和描述)
但是,除非真正应用 CSS,否则这将不起作用,所以我将提供第二个选项,它在<title>
元素中比 Unicode 变体选择器更可靠(我正在 GitHub 上查看。我不喜欢我的浏览器标签):
如果您将用户提供的字符串放入<title>
元素中,请过滤掉表情符号以及任何粗体/斜体/下划线/等。标记。(是的,对于那些错过它的人,标准确实要求<title>
除了&符号转义之外的内容是纯文本,并且我测试的浏览器将所有标签解释为文字文本。)
我能想到的两种方法是:
- 直接使用手动维护的正则表达式,该正则表达式匹配最新版本的 Unicode 放置其表情符号及其修饰符的块。
- 遍历字素簇并丢弃任何包含已识别表情符号代码点的内容。(字形集群是一个基本字形加上构成可见字符的所有变音符号和其他修饰符。我链接到的示例使用 Python 的正则表达式引擎进行标记,然后
emoji
是数据库的包,但 Rust 是一种很好的语言示例通过像unicode-segmentation
.)这样的箱子可以快速轻松地迭代字形集群。