0

私は次のような文字列を持っています:

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

私の問題は:

  1. string 内の文字を解析し、特定の 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

ええ、私はそれをしました、のように:

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 パーサーを作成することもできます。Parslet Infactを確認してください。 付属のサンプルにはXML パーサーが含まれています。

このようなもの:

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>"

[{:太字=>[{:text=>"太字"@3}, {:斜体=>[{:text=>"斜体"@10}]}, {:text=>"再び太字"@21 }、{:下線=>[{:テキスト=>"下線"@36}]}]}]

ご覧のとおり、このツリーには太字イタリック体などのスタイル ノードとその中のコンテンツがあります。

空白を処理したり、気になる他のタグを処理したりするために簡単に拡張できます。気にしないタグを扱うのは少し難しいです。

とにかく.. 可能性を示しているだけです。

通常、Parslet を使用して Transform クラスを作成し、このツリー構造を最終的に希望するものに変換します。私は、Parslet が解析済みデータの使用から解析を分離する方法が気に入っています。

お役に立てれば。

于 2012-05-24T07:00:27.553 に答える
0

私が間違っている場合は修正してください。テキスト内の特定の html タグを見つけて、それらを操作したいですか? のこぎりジェムは試しましたか?

そしてそのようなことをします:

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 に答える