0

我有这样的字符串:

sanitize_text = `"<b><i>this is the bold text</i></b><i>this is the italic</i>"`

我的问题是:

  1. 解析字符串中的字符并找到特定的 html 标记('<b>','<i>' ...),然后在 text 之间应用属性。

  2. 需要为每个文本应用属性。

我正在接近这样:

sanitize_arr = sanitize_text.scan(/\D\d*/)

santize_arr.each_with_index do |char, index|
  if character is new start tag == '<b>'
    Then for next characters till '</b>' I will apply some bold properties .    
  end
  if character is new start tag == '<i>'
    Then for next characters till '</i>' I will apply some italic properties .
  end
end

只是想知道我是否朝着正确的方向接近,或者是否有更好的解决方案,请告诉我。

4

3 回答 3

0

如果我错了,请纠正我。您想在文本中查找特定的 html 标签并对其进行一些操作吗?你试过Nokogiri gem吗?

并做这样的事情:

require 'nokogiri'
nokogiri_object=Nokogiri::HTML(sanitize_text)
bold_text=nokogiri_object.css('b').text
puts bold_text

输出 "this is the bold text"

于 2012-05-23T07:03:42.380 回答
0

是的,我已经做到了,例如:

santize_text = "<b><u>this</u></b><i><p>this is the italic text</p></i>"

santize_arr = santize_text.scan(/\D\d*/)
char_array , html_tag_array = [], []
continue_insert_char_array, continue_insert_arr2 = false,false
santize_arr.each_with_index do |char, index|
  #To check new start tag
  continue_insert_char_array = true if char=='<' && santize_arr[index+1]!='/'
  if continue_insert_char_array
    char_array << char
    if char=='>' && continue_insert_char_array
      continue_insert_char_array = false
      html_tag_array << char_array.join
      char_array = []
    end
    next
  end

  #To check new end tag
  continue_insert_arr2 = true if char=='<' && santize_arr[index+1]=='/'
  if continue_insert_arr2
    char_array << char
    if char=='>' && continue_insert_arr2
      continue_insert_arr2 = false
      html_tag_array.delete(char_array.join.gsub('/', ""))
      char_array = []
    end
    next
  end

  # Apply the property on the character
  "Bold Char" if html_tag_array.include?("<b>")
  "Italic Char" if html_tag_array.include?("<i>")
end

请让我知道是否有任何更改以使其更好。

于 2012-05-23T07:08:49.413 回答
0

您可以编写自己的 XML Parser.. 不认真!查看Parslet Infact ,它附带的示例包括XML Parser

像这样的东西:

require 'parslet'

class XML < Parslet::Parser
  root :document

  rule(:document)   { (formatting | text).repeat(1) }  
  rule(:formatting) { tag_pair('b').as(:bold) | tag_pair('u').as(:underline) | tag_pair('i').as(:italic) } 

  def tag(type)
     str('<') >> str(type) >> str('>')
  end

  def tag_pair(type)
    tag(type) >> document.maybe >> tag("/" + type)
  end

  rule(:text) {
    match('[^<>]').repeat(1).as(:text)
  }
end

 parser = XML.new
 input = ARGV[0]

 require 'parslet/convenience'
 puts parser.parse_with_debug(input).inspect

产生这样的东西......

> ruby xmlparser.rb "<b>bold<i>italic</i> bold again <u>underlined</u></b>"

[{:bold=>[{:text=>"bold"@3}, {:italic=>[{:text=>"italic"@10}]}, {:text=>" 再次加粗"@21 }, {:underline=>[{:text=>"underlined"@36}]}]}]

如您所见,此树具有粗斜体等样式节点以及其中的内容。

它可以很容易地扩展到处理空白,并处理您关心的其他标签。处理你不关心的标签有点困难。

无论如何..只是展示了可能性。

使用 Parslet,您通常会编写一个 Transform 类来将此树结构转换为您最终希望做的事情。我喜欢 Parslet 将解析从使用解析的数据中分离出来的方式。

希望这可以帮助。

于 2012-05-24T07:00:27.553 回答