0

我有一个未排序的数组,其中包含以下 ID:

@un_array = ['bar', 'para-3', 'para-2', 'para-7']

有没有一种聪明的方法可以使用Nokogiri(或纯 Javascript)根据下面示例 HTML 文档中的 ID 顺序对数组进行排序?

require 'rubygems'
require 'nokogiri'

value = Nokogiri::HTML.parse(<<-HTML_END)
  "<html>
    <head>
    </head>
    <body>
        <p id='para-1'>A</p>
        <div id='foo'>
            <p id='para-2'>B</p>
        <p id='para-3'>C</p>
            <div id='bar'>
                <p id='para-4'>D</p>
                <p id='para-5'>E</p>
                <p id='para-6'>F</p>
        </div>
         <p id='para-7'>G</p>
        </div>
        <p id='para-8'>H</p>
    </body>
    </html>"
HTML_END

在这种情况下,生成的排序数组应该是:

['para-2', 'para-3', 'bar', 'para-7']
4

3 回答 3

1

我不知道 Nokogiri 是什么,但是如果您将 HTML 代码作为字符串,则可以通过正则表达式匹配获得订单,例如:

var str = '<html>...</html>'; // the HTML code to check
var ids = ['bar', 'para-3', 'para-2', 'para-7']; // the array with all IDs to check
var reg = new RegExp('(?:id=[\'"])('+ids.join('|')+')(?:[\'"])','g') // the regexp
var result = [], tmp; // array holding the result and a temporary variable
while((tmp = reg.exec(str))!==null)result.push(tmp[1]); // matching the IDs
console.log(result); // ['para-2', 'para-3', 'bar', 'para-7']

使用此代码,您必须小心包含正则表达式元字符的 ID。他们应该首先逃脱。

于 2009-05-06T16:31:53.680 回答
0

这是在 Nokogiri 中执行此操作的一种方法 - 可能还有其他更有效的方法,因为这最终会遍历整个 DOM。

require 'set'

#Using a set here to make lookup O(1), because we don't care about the initial order
id_set = ['bar', 'para-3', 'para-2', 'para-7'].to_set
sorted = []

value.root.traverse do |node|
  node_id = node['id']
  sorted << node_id if node_id && id_set.delete?(node_id)
end
# sorted is now ['para-2', 'para-3', 'bar', 'para-7']

编辑:这是一个获得相同结果的单线,但我还没有进行基准测试以查看哪个更快。

ids = ['bar', 'para-3', 'para-2', 'para-7']
value.xpath("//*[@id]").collect {|node| node['id']} & ids
于 2009-05-06T16:37:29.377 回答
0

这是一个同事和我想出的解决方案:

parent = value.css('body').first
indexes = []
parent.children.each do |child|
  indexes << child['id']
end

puts @un_array.sort! { |x,y| indexes.index(x) <=> indexes.index(y) }

首先,我将 HTML 文档的所有 ID 提取到一个数组中,@un_array然后根据我之前创建的 IDs-Array 进行排序。

于 2009-05-07T13:39:53.023 回答