【问题标题】:Link Detection / String to Link (even without www)链接检测/字符串到链接(即使没有 www)
【发布时间】:2014-05-21 19:53:07
【问题描述】:

案例:一个用户的个人资料,他可以在其中添加一堆链接。

我通过用户注册页面收集链接,但我遇到了用户未输入 www 的问题。和 http:// 在 URL 前面。

我可以用auto_link 解决http:// 问题,但我必须让很多用户只输入example.com

如何从字符串中提取 URL,即使它没有 www。或 http://(该字段包含 只有网址)。

显示代码:

<% if @user.website.present? %>
  <li>
    <%= link_to @user.website, target: '_blank' do %>
      <i class="fa fa-globe"></i> <span>Website</span>
    <% end %>
  </li>
<% end %>

【问题讨论】:

  • 类似 "example.com/foo/bar".gsub(/\A(http:\/\/)?(www\.)?(.*)/,"www .\\3") ?
  • 贾苏·斯塔夫罗。是的,我想过正则表达式,但我不知道如何在我的模型中正确实现它。你能再描述一下吗?
  • 检查答案,如果你愿意,我可以改进

标签: ruby-on-rails ruby-on-rails-4 hyperlink autolink


【解决方案1】:

考虑以下示例网址:

text1="example.com/foo/bar"
text2="www.example.com/foo/bar"
text3="http://www.example.com/foo/bar"
text4="https://www.example.com/foo/bar"

这个:

gsub(/\A(http(s)?:\/\/)?(www\.)?(.*)/,"http\\2://www.\\4")

将输出以下内容:

text1.gsub(/\A(http(s)?:\/\/)?(www\.)?(.*)/,"http\\2://www.\\4") 
# http://www.example.com/foo/bar

text2.gsub(/\A(http(s)?:\/\/)?(www\.)?(.*)/,"http\\2://www.\\4") 
# http://www.example.com/foo/bar

text3.gsub(/\A(http(s)?:\/\/)?(www\.)?(.*)/,"http\\2://www.\\4") 
# http://www.example.com/foo/bar

text4.gsub(/\A(http(s)?:\/\/)?(www\.)?(.*)/,"http\\2://www.\\4") 
# https remains
# https://www.example.com/foo/bar 

所以,如果你想使用link_to外部链接:

<%= link_to '<i class="fa fa-globe"></i> <span>Website</span>'.html_safe, 
    @user.website.
    gsub(/\A(http(s)?:\/\/)?(www\.)?(.*)/,"http\\2://www.\\4") unless
    @user.website.nil? %>

编辑:

上面的情况会有一个不好的异常。

text5="http://example.com/foo/bar"

上面的替换将返回

http://www.example.com/foo/bar # inserting a "www"

这在大多数情况下是不行的。因此,您必须提供替代条件。我建议你创建一个这样的辅助方法:

def url_to_external(text)
    /\Ahttp(s)?:\/\//.match(text) ? text : text.gsub(/\A(http(s)?:\/\/)?(www\.)?(.*)/,"http\\2://www.\\4")
end

仅当字符串开头没有“http://”或“https://”时才会替换。

在你看来,那么:

<%= link_to '<i class="fa fa-globe"></i> <span>Website</span>'.html_safe,
    url_to_external(@user.website) unless @user.website.nil? %>

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2015-02-02
    • 2015-09-10
    相关资源
    最近更新 更多