在超链接中包装文本中的链接 - Ruby On Rails

时间:2016-03-17 10:36:34

标签: ruby-on-rails ruby

我有新闻的描述。为了显示新闻文本,我使用simple_format将新行包装到<p></p>标记中。

但是,新闻文本可能包含链接。现在我需要将文本中的链接包装到<a></a>标签中。

如果有人可以提供有关如何做到这一点的见解,将会非常有帮助。

示例文字:

Lorem ipsum dolor坐下来,精神恍惚。 Ad,ea esse magni obcaecati quasi quis soluta velit。 Accusamus doloribus ea et officicialia,pariatur quia saepe sed tempore temporibus totam https://stackoverflow.com/posts/36058019/edit

期望的输出:

Lorem ipsum dolor坐下来,精神恍惚。 Ad,ea esse magni obcaecati quasi quis soluta velit。 Accusamus doloribus ea et officianceia,pariatur quia saepe sed tempore temporibus totam? <a src="https://stackoverflow.com/posts/36058019/edit">https://stackoverflow.com/posts/36058019/edit</a>

我的方法

现在我通过以下功能解决了它。首先,我将字符串拆分为换行符,以确保simple_format插入适当的p标记。然后,我将文本与url正则表达式匹配,然后将其包装在a标记内。

def parse_text(text)
    text.split("\n").map do |t|
      t.split(' ').map {|x| x.match(/https?:\/\/[\S]+/) ? "<a href=#{x}>#{x}</a>" : x }.join(' ')
    end.join("\n").html_safe
  end

3 个答案:

答案 0 :(得分:0)

@devanand 评论说,如果您将文字换成所需的标签并使用html_safe

,则会更好

但是,您需要在<a>标记内包装文本中的所有网址。

> str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad, ea esse magni obcaecati quasi quis soluta velit. Accusamus doloribus ea et ex officia, pariatur quia saepe sed tempore temporibus totam https://stackoverflow.com/posts/36058019/edit"
# extract all urls from string
> urls = URI.extract(str)
# wrap url text within <a> tag
> urls.each{|u| str.gsub!(u, "<a src='#{u}'>#{u}</a>")}
> puts str
#=> "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad, ea esse magni obcaecati quasi quis soluta velit. Accusamus doloribus ea et ex officia, pariatur quia saepe sed tempore temporibus totam <a src='https://stackoverflow.com/posts/36058019/edit'>https://stackoverflow.com/posts/36058019/edit</a>"

Demo

注意:,因为如果在网址的开头和结尾没有空格,则评论URI.extract的RSB无法正常工作

答案 1 :(得分:0)

我可以建议你采用两种方法来做到这一点,第一种也是直接的方法是使用所见即所得编辑器,例如: CKEditor  或者Tinymce,这对于撰写文章来说是最好的解决方案。

其次,您可以在URL的开头和结尾添加一些标记,以便更轻松地进行解析。 e.g。

str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad, ea esse magni obcaecati quasi quis soluta velit. Accusamus doloribus ea et ex officia, pariatur quia saepe sed tempore temporibus totam `http://stackoverflow.com/posts/36058019/edit`"

但这也不会那么准确。第三,你可以像Gagan在他的回答中提到的那样从字符串中提取URL,但是当url之间没有空格或多次重复相同的URL时,它也会失败。

所以,我认为使用任何WYSIWYG编辑器来解决每个案例的这个问题会很好。

希望有所帮助!

答案 2 :(得分:0)

与此类似的功能曾经是Rails的一部分,但在Rails 3.1中已被删除。 Rails auto_link gem已被提取并可供升级人员使用。 https://rubygems.org/gems/rails_autolink

这应该可以让您转换链接,然后简单地格式化段落:

simple_format(auto_link("..."))