【问题标题】:Remove all a tags from string从字符串中删除所有标签
【发布时间】:2019-06-21 15:51:09
【问题描述】:

我有一个用户正在输入的字符串。他们可以添加与链接一样多的链接,但我们只希望某些用户能够单击链接。我想要做的是将任何 a 标签替换为其中的文本。如果有一个链接,我已经设法做到了,但是当有多个链接时,我不知道该怎么做。

这是我目前拥有的,并且已经尝试了许多变体来实现这一点:

url_text = text.split("<a").last.split("</a>").first.split('>').last
text.gsub! /<a.+a>/m, url_text

但它只适用于标签的第一个实例。

我收到的字符串如下所示:

text = <div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div>"

我想让它说: 等等等等等等。 谷歌 另一个链接: 测试链接

任何帮助将不胜感激。如果您需要更多代码或信息,请告诉我。

【问题讨论】:

  • 强制性.... DO NOT PARSE HTML WITH REGEX。 th̘ë͖̉͠p̯͍̭o̚n̐y̡h̸̡̪̯ͨ͊̽̅̾ȩ̸̡̬̩̪̯̾͛ͪ̈ͨ͊̽̅̾͘ȩ̬̩̾͛ͪ̈͘oͮ͏̮̪̝͍m̖͊̒ͪͩͬ̚̚͜ȇ̴̟̟͙̞ͩ͌͝s̨̥̫͎̭ͯ̿̔s̨̥̫͎̭ͯ̿̔s̨̥̫͎̭ͯ̿̔s̨̥̫͎̭ͯ̿̔s̨̥̫͎̭ͯ̿̔s̨̥̫͎̭̖ͯ̿̔͊̒ͪͩͬ̚̚͜ȇ̴̟̟͙̞̖ͩ͌͊̒ͪͩͬ̚̚͜͝ȇ̴̟̟͙̞ͩ͌͝您的代码可能无法适用于所有边缘案例,而且通常是一个非常糟糕的想法 i>让用户输入像这样的任意html - 你把自己敞开到xss攻击。
  • 一个更好的主意是使用 HTML 解析器将特定的 HTML 标签显式列入白名单(可能针对不同的用户使用不同的列表)。不是正则表达式。 edgeapi.rubyonrails.org/classes/ActionView/Helpers/… -- 这个方法可能就是你所需要的。
  • @TomLord - 很好,这就是为什么我想问一定有更好的方法。只有超级用户才能进入它,它来自 tinymce,所以他们不会自己添加 html。
  • 使用所见即所得的编辑器并不能保护您免受恶意用户的侵害。您仍然可以在表单中提交任意数据。但是,如果您完全信任用户,那么(与大多数事情一样)安全性就不那么重要了。

标签: ruby-on-rails regex ruby string


【解决方案1】:

根据documentationstrip_tagsActionView::Helpers::SanitizeHelper模块的一个方法。对我来说,只是为了在我的课程中包含这个模块,然后你可以像这样使用它的方法:

strip_tags(your_text_with_html)

【讨论】:

    【解决方案2】:

    使用 Rails 助手

    ActionView::Base.full_sanitizer.sanitize('text = <div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div>"
    ')
    
    "text = blah blah blah.\\r\\nGoogleAnother link:  Test Link\"\n" 
    

    【讨论】:

    • 这是否也会删除 ERB 标签和它们之间的任何东西?
    【解决方案3】:

    @mrzasa 似乎已经破解了它,但如果您想知道为什么正则表达式不起作用,那是因为它太贪婪了。

    使用 ? 惰性运算符意味着扫描返回的条件字符尽可能少。

    以下将惰性运算符添加到搜索中,我相信可以按您的预期工作:

    text = "<div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div><div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div>"
    text.gsub(/<a.*?>(.+?)<\/a>/, '\1')
    
    # => "<div>blah blah blah.<br /><br /></div>\r\n<div>Google<br />Another link: <br /> Test Link<br /><br /></div><div>blah blah blah.<br /><br /></div>\r\n<div>Google<br />Another link: <br /> Test Link<br /><br /></div>"
    

    '\1' 作为gsub 的第二个参数简单地替换为第一个匹配项。

    希望这在某种程度上有用,如果您更愿意使用正则表达式,可以提供灵活的选择。

    【讨论】:

    • 使用有限的字符集比使用惰性运算符更好:/&lt;a[^&gt;]*&gt;([^&lt;]+)&lt;\/a&gt;/。我已经在blogpost 中描述了它
    • 啊,太好了,谢谢@mrzasa,感谢您的反馈。将阅读您的链接,并在未来实现自己。
    • 好的,如果您有任何问题,请将 cmets 留在 medium 上,我很乐意为您解答!
    【解决方案4】:

    您可以使用strip_tags(删除所有标签)或strip_links(仅删除链接)。

    在 Rails 控制台中:

    > text = '<div>blah blah blah.<br /><br /></div>\r\n<div><a href=\"http://www.google.com\">Google</a><br />Another link: <br /> <a href=\"http://www.test.com\">Test Link</a><br /><br /></div>'
    => "<div>blah blah blah.<br /><br /></div>\\r\\n<div><a href=\\\"http://www.google.com\\\">Google</a><br />Another link: <br /> <a href=\\\"http://www.test.com\\\">Test Link</a><br /><br /></div>"
    > helper.strip_tags(text)
    => "blah blah blah.\\r\\nGoogleAnother link:  Test Link"
    

    【讨论】:

    • 我选择了 strip_links,因为我想保留其他标签。谢谢!
    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 2015-10-09
    • 2015-11-18
    • 2014-05-27
    • 2013-02-24
    • 2014-08-07
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多