即使不进行编码也从xml字符串或文件中删除表情符号

问题描述 投票:0回答:1

我想从XML文件中删除表情符号。典型的示例字符串可能类似于:

<a>🤬 grêve &#55357;&#56628; SNCF 🔴 ➡️</a>

我只想拥有:

<a>grêve SNCF</a>

我试图在解析阶段之后使用Nokogiri的noent选项和一些过滤器,但是to_xml将表情符号作为HTML实体返回,并且我不再检测到它们。它返回类似:

<a>&#x1F92C; gr&#xEA;ve  SNCF &#x1F534; &#x27A1;&#xFE0F;</a>
require 'nokogiri'

xml = Nokogiri::XML(%{
  <root>
    <aliens>
      <alien>
        <name>
          🤬 grêve &#55357;&#56628; 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以获取更多信息。

ruby xml nokogiri emoji
1个回答
0
投票

[您要的是Nokogiri做某事,但这实际上不是它的工作。 Nokogiri应该解析有效的XML和those characters seem to be valid。在这种情况下,我们不得不对文件进行预处理,然后再交出。病理损坏的XML或HTML也会发生相同的情况;它很脏,我们觉得很脏,但这是完全可以接受的,而不是事后跳了圈。

我会使用一种或几种模式,以除去正常ASCII范围之外的任何字符,或将XML传递给Nokogiri之前您认为可接受的任何范围。举一个简单而又肮脏的例子,它去除了ASCII范围之外的所有内容,但是您需要对其进行微调ê

对其进行微调。
'<a>🤬 grêve &#55357;&#56628; SNCF 🔴 ➡️</a>'.gsub(/[^\x20-\x7e]+/, '')
# => "<a> grve &#55357;&#56628; SNCF  </a>"

或:

'<a>🤬 grêve &#55357;&#56628; SNCF 🔴 ➡️</a>'.gsub(/[^[:ascii:]]+/, '')
# => "<a> grve &#55357;&#56628; SNCF  </a>"

Ruby的Regexp documentation将帮助您进行微调。

就“ How do I remove emoji from string”中的解决方案而言,它也可以使用,但是会变慢,因为它会遍历每个字符。带有模式的gsub会将其传递给Ruby的正则表达式引擎,如果将其传递给整个XML文件,它将运行得更快。

© www.soinside.com 2019 - 2024. All rights reserved.