【问题标题】:Wrap links in text within hyperlinks - Ruby On Rails在超链接中包裹文本中的链接 - Ruby On Rails
【发布时间】:2016-03-17 10:36:33
【问题描述】:

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

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

如果有人能就如何做到这一点提供见解,那将非常有帮助。

示例文本:

Lorem ipsum dolor sit amet, consectetur adipisicing elit。广告,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

期望的输出:

Lorem ipsum dolor sit amet, consectetur adipisicing elit。广告,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>

我的方法

现在我通过以下函数解决了它。首先,我将字符串拆分为换行符,以确保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

【问题讨论】:

  • 将示例文本粘贴到答案中
  • 您可以在文本中添加 html 标签。在网页上显示文本字段需要将给定文本标记为“安全”。 field.html_safe 应该可以解决您的问题。但请注意您的文字来自哪里!
  • @RSB 添加了文本和想要的结果

标签: ruby-on-rails ruby


【解决方案1】:

正如 @devanand 所说,如果您将文本包装在所需的标签中并使用 html_safe

,效果会更好

但是您需要将所有 url 从文本中包含在 &lt;a&gt; 标记中。

> 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

注意:正如 RSB 评论的那样,如果 URL 的开头和结尾没有空格,URI.extract 将不起作用

【讨论】:

  • 如果 URL 的开头和结尾没有空格,URI.extract 将不起作用
  • @RSB :是的,但我刚刚将转换后的 OP 的样本数据提供给预期的输出。用注释更新答案。 ;)
  • @GaganGami @RSB 当同一个链接出现多次时,嵌套包装就像a标签的href被包装在另一个a标签中一样
  • @abhinavmsra:嗯,没错。在这种情况下,我们需要先从字符串中删除&lt;a&gt;,然后执行相同操作。此答案仅针对 OP 从示例中获得的所需输出而发布。
【解决方案2】:

我可以建议您几种方法来做到这一点,第一种也是直接的方法是使用 wysiwyg 编辑器,例如CKEditorTinymce,这将是写文章的最佳解决方案。

其次,您可以在 URL 的开头和结尾添加一些标记,以使解析更容易。例如

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 编辑器来解决每个案例都会很好。

希望有帮助!

【讨论】:

    【解决方案3】:

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

    这应该使您能够转换链接,然后简单地格式化段落:

    simple_format(auto_link("..."))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2012-10-31
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多