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]
終わり