我想从XML文件中删除表情符号。典型的示例字符串可能类似于:
<a>🤬 grêve �� SNCF 🔴 ➡️</a>
我只想拥有:
<a>grêve SNCF</a>
我试图在解析阶段之后使用Nokogiri的noent
选项和一些过滤器,但是to_xml
将表情符号作为HTML实体返回,并且我不再检测到它们。它返回类似:
<a>🤬 grêve SNCF 🔴 ➡️</a>
require 'nokogiri'
xml = Nokogiri::XML(%{
<root>
<aliens>
<alien>
<name>
🤬 grêve �� SNCF 🔴 ➡️
</name>
</alien>
</aliens>
</root>
}) do |config|
config.noent
end
puts xml
# emoticons
clean_xml_str = xml.to_xml
.unpack('U*')
.reject{ |e|
# emoticons block
e.between?(0x1F600, 0x1F6FF) ||
# basic block - control characters
e.between?(0x0000, 0x001F) ||
# Private Use Area
e.between?(0xE000, 0xF8FF)
}
.pack('U*')
puts clean_xml_str
请参阅sandbox on repl.it以获取更多信息。
[您要的是Nokogiri做某事,但这实际上不是它的工作。 Nokogiri应该解析有效的XML和those characters seem to be valid。在这种情况下,我们不得不对文件进行预处理,然后再交出。病理损坏的XML或HTML也会发生相同的情况;它很脏,我们觉得很脏,但这是完全可以接受的,而不是事后跳了圈。
我会使用一种或几种模式,以除去正常ASCII范围之外的任何字符,或将XML传递给Nokogiri之前您认为可接受的任何范围。举一个简单而又肮脏的例子,它去除了ASCII范围之外的所有内容,但是您需要对其进行微调ê
:
'<a>🤬 grêve �� SNCF 🔴 ➡️</a>'.gsub(/[^\x20-\x7e]+/, '')
# => "<a> grve �� SNCF </a>"
或:
'<a>🤬 grêve �� SNCF 🔴 ➡️</a>'.gsub(/[^[:ascii:]]+/, '')
# => "<a> grve �� SNCF </a>"
Ruby的Regexp documentation将帮助您进行微调。
就“ How do I remove emoji from string”中的解决方案而言,它也可以使用,但是会变慢,因为它会遍历每个字符。带有模式的gsub
会将其传递给Ruby的正则表达式引擎,如果将其传递给整个XML文件,它将运行得更快。