0

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

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

我可以使用auto_link修复 http:// 问题,但我必须让许多用户只输入example.com.

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

显示代码:

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

1 回答 1

1

考虑以下示例 url:

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? %>
于 2014-04-09T11:50:21.633 回答