链接检测/字符串链接(即使没有www)

时间:2014-04-08 21:28:40

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

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

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

我可以使用auto_link解决http://问题,但我需要输入example.com的许多用户。

  

如何从String中提取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 %>

1 个答案:

答案 0 :(得分: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? %>