考虑以下示例 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? %>