Ruby on rails 正则表达式只从字符串中删除开始和结束html标记?
例如,我想从下面的字符串中删除Ruby on rails 正则表达式只从字符串中删除开始和结束html标记?,ruby-on-rails,ruby,regex,Ruby On Rails,Ruby,Regex,例如,我想从下面的字符串中删除和。正则表达式应该能够从字符串的开头和结尾删除任意数量的标记 <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> 测试所选内容的文
和
。正则表达式应该能够从字符串的开头和结尾删除任意数量的标记
<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>
测试所选内容的文本。
适用于所有人的Kibology。都是为了基博利 我一直在修补rubular.com,但没有成功。谢谢
(?:\\)\124;(?:\\)
是您需要的表达式。但这并不适用于所有场景。。。如果您试图解析任何可能的标记组合,那么您可能需要查看其他解析方法
例如,这个表达式不允许div和p标记之间有任何空格。因此,如果您想考虑到这一点,您可以在
\>\之间添加\s*
,我将继续回答我自己的问题。以下是程序路线:
输入字符串作为数组进入第一个循环,以便删除前面的标记。生成的字符串按相反顺序循环,以删除结束标记。然后将字符串颠倒,以便按正确顺序排列
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
def删除html结束标记(html结束标记)
str_no_start_tag=''
str_no_start_和_end_tag=''
a=html_str.split(“”)
i=0
is_text=false
当我def删除html\u end\u标记(html\u str)时
html\u str.match(/\(?!\W*\仍然涉及一些编程:
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
str='测试所选内容的文本。
所有的基博洛伊
。所有的基博洛伊。'
而(m=/\A/.match(str))&&str.end_with?('似乎比regex更适合HTML解析器。我认为在这种情况下,下意识的“不要用regex解析HTML”是没有根据的。在这个主题上有一篇很好的博客文章;有时候你不需要一个功能齐全的XML解析库来完成一个特定的、琐碎的任务。也就是说,如果你想尝试XML解析器,请查看v*
匹配任何(0到无穷大)v
s的数量,你的意思是*
。不需要转义
。你不需要对替代项进行分组(你可以删除所有组)。是的,我正在寻找解析任何html标记的方法。@phyatt,你明白@Qtax在说什么吗?是的,regex
(例如)将匹配字符串
,但它也将匹配字符串,如
或
。它不会匹配带有属性的标记,如
@Alanmore是的,我知道。我之前写这个答案的时候很匆忙,因为我只是想让用户使用gskinner开发正则表达式的工具。我很快会编辑它,使其更加防弹。而且当我写答案的时候,我不知道他在寻找任何html标记。听起来他只是想找到并删除这两个标记关于*v
,你是对的。请看编辑。我读到的内容是,你确实需要转义
,因为它们可以用于向前看和向后看匹配。也许Ruby不要求转义它们,但其他正则表达式引擎可能需要转义。我遵循了我在上的信息栏中看到的内容我的程序通常用C++编程,所以我想我可能会“逃走”。脚本语言中不必要的东西。谢谢你指出我答案中的错误。嘿@MichealDodge,如果你能对你的答案提供一些解释会更好。@thomasfedb是对的;如果OP自己不能想出这个解决方案,你应该假设他需要一些帮助来理解它。但是这个问题甚至不可能解决ork。
使用前两个标记,因为它们是一个(
),而且我非常确定前瞻中的\W*
应该是\s*
(零个或多个空格字符)。谢谢,我添加了一些解释。您最好使用正则表达式。上面的Michael更符合要求。
def remove_html_end_tags(html_str)
html_str.match(/\<(.+)\>(?!\W*\<)(.+)\<\/\1\>/m)[2]
end
def remove_html_end_tags(html_str)
html_str.match(/\<([^\>\<]+)\>(?!\W*?\<)(.+)\<\/\1\>/m)[2]
end
\>(?!\W*\<)
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]
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