在超链接内将链接换行到文本中- Ruby On Rails

6qftjkof  于 2023-04-20  发布在  Ruby
关注(0)|答案(3)|浏览(101)

我有一个新闻的描述。为了显示新闻文本,我使用了simple_format,它将新行 Package 到<p></p>标记中。
但是,新闻文本可能包含链接。现在我需要将文本中的链接 Package 到<a></a>标签中。
如果有人能就如何做到这一点给予见解,那将是非常有帮助的。
示例文本:
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
预期输出:
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>

我的方法

现在我通过下面的函数解决了这个问题。首先,我将字符串拆分为换行符,以确保simple_format将插入适当的p标签。然后,我将文本与url正则表达式匹配,然后将其 Package 在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
rlcwz9us

rlcwz9us1#

我可以建议你几种方法来做到这一点,第一个和直接的方法是使用所见即所得编辑器,例如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编辑器来解决每个情况下的这个问题都是很好的。
希望有帮助!

bihw5rsg

bihw5rsg2#

类似于此的功能曾经是Rails的一部分,但在Rails 3.1中被删除。Rails auto_link gem被提取出来,供升级人员使用。https://rubygems.org/gems/rails_autolink
这应该可以让你转换链接,然后简单地设置段落的格式:

simple_format(auto_link("..."))
cbeh67ev

cbeh67ev3#

正如**@devanand**评论的那样,最好将文本 Package 在所需的标记中并使用html_safe
但是你需要把所有的url从<a>标签中的文本 Package 起来。

> 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 href='#{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将无法工作

相关问题