0

<div><p>たとえば、以下の文字列から削除したいと思い</p></div>ます。正規表現は、文字列の最初と最後から任意の数のタグを削除できる必要があります。

<div><p>text to <span class="test">test</span> the selection on.
Kibology for <b>all</b><br>. All <i>for</i> Kibology.</p></div>

私はrubular.comをいじくり回して成功していません。ありがとう!

4

4 に答える 4

1
 def remove_html_end_tags(html_str)
   html_str.match(/\<(.+)\>(?!\W*\<)(.+)\<\/\1\>/m)[2]
 end

\ <(。+)>が複数の開始タグを消費するという問題は見られません 。これは、Alan Mooreが以下で指摘したように、間違っていることに同意するため、奇妙なことです。\ <([^> \ <] +)>または曖昧性解消に類似したものに変更する必要があります。

 def remove_html_end_tags(html_str)
    html_str.match(/\<([^\>\<]+)\>(?!\W*?\<)(.+)\<\/\1\>/m)[2]
 end

アイデアは、最初に遭遇したタグの開閉の間のすべてをキャプチャしたいということですが、間にスペースがあっても、すぐには別のタグが続きません。

(前向きに)どのように言うかわからなかったので、次の開き角ブラケットの前に、閉じ角ブラケットの後に少なくとも1つの単語文字が続く最初のキーを教えてください。

\>(?!\W*\<)

次の開き山かっこの前に、単語以外の文字がすべて含まれていない閉じ山かっこを見つけます。

その属性を持つキーを特定したら、そのクロージングメイトを見つけて、その間にあるものを返します。

別のアプローチがあります。前方にスキャンしているタグを見つけて、最初のnを削除します。同じタイプのネストされたタグで爆発しますが、実際の作業ではこのアプローチを採用しません。

def remove_first_n_html_tags(html_str, skip_count=0)
  matches = []
  tags = html_str.scan(/\<([\w\s\_\-\d\"\'\=]+)\>/).flatten  
  tags.each do |tag|
   close_tag = "\/%s" % tag.split(/\s+/).first
   match_str = "<#{tag}>(.+)<#{close_tag}>"
   match = html_str.match(/#{match_str}/m) 
   matches << match if match
 end
 matches[skip_count]

終わり

于 2012-06-10T06:47:40.017 に答える
0

まだいくつかのプログラミングが含まれています:

str = '<div><p>text to <span class="test">test</span> the selection on.
Kibology for <b>all</b><br>. All <i>for</i> Kibology.</p></div>'

while (m = /\A<.+?>/.match(str)) && str.end_with?('</' + m[0][1..-1])
  str = str[m[0].size..-(m[0].size + 2)]
end

クトゥルフあなたはそこにいますか?

于 2012-06-10T17:02:45.087 に答える
-1

(?:\<div.*?\>\<p.*?\>)|(?:\<\/p\>\<\/div\>)必要な表現です。ただし、これはすべてのシナリオをチェックするわけではありません...タグの可能な組み合わせを解析しようとしている場合は、他の解析方法を検討することをお勧めします。

たとえば、この式では、divタグとpタグの間に空白を入れることはできません。したがって、それを許可したい場合は、次のようにタグ\s*のセクションの間に追加します。\>\<(?:\<div.*?\>\s*\<p.*?\>)|(?:\<\/p\>\s*\<\/div\>)

式が記述されているため、divタグとpタグは小文字である必要があります。したがって、DivまたはdIVも検出されるように、それぞれの大文字または小文字をチェックする方法を見つけたい場合があります。

正規表現のテストと学習には、gskinnerのRegExツールを使用します。

したがって、エンドルビーコードは次のようになります。

# Ruby sample for showing the use of regular expressions

str = "<div><p>text to <span class=\"test\">test</span> the selection on.
Kibology for <b>all</b><br>. All <i>for</i> Kibology.</p></div>"

puts 'Before Reguar Expression: "', str, '"'

str.gsub!(/(?:\<div.*?\>\s*\<p.*?\>)|(?:\<\/p\>\s*\<\/div\>)/, "")

puts 'After Regular Expression', str

system("pause")

編集:コメントの提案ごとに置き換えdiv*?られdiv.*?、置き換えp*?られました。p.*?編集:この回答では、タグのセットは許可されていません。質問の最初の行にリストされている2つだけです。

于 2012-06-10T02:33:40.200 に答える
-1

私は先に進んで、自分の質問に答えるつもりです。以下はプログラムによるルートです。

入力文字列は、フロントタグを削除するために、配列として最初のループに入ります。結果の文字列は、終了タグを削除するために逆の順序でループされます。次に、文字列を逆にして、正しい順序にします。

def remove_html_end_tags(html_str)

 str_no_start_tag = ''
 str_no_start_and_end_tag = ''

  a = html_str.split("")

     i= 0 
     is_text = false
     while i <= (a.length - 1)
       if (a[i] == '<') && !is_text
         while (a[i] != '>')
           i+= 1
         end 
          i+=1
       else
         is_text = true
          str_no_start_tag << a[i] 
         i+=1
       end
     end

    a = str_no_start_tag.split("")

    i= a.length - 1 
    is_text = false
    while i >= 0
      if (a[i] == '>') && !is_text
        while (a[i] != '<')
           i-= 1
        end 
        i-=1
      else
        is_text = true
        str_no_start_and_end_tag << a[i] 
        i-=1
      end
   end 

  str_no_start_and_end_tag.reverse!

 end
于 2012-06-10T05:39:16.340 に答える