Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 正则表达式只从字符串中删除开始和结束html标记?_Ruby On Rails_Ruby_Regex - Fatal编程技术网

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