案例:用户个人资料,他可以添加一堆链接。
我通过用户注册页面收集链接,但我遇到了用户没有输入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 %>
答案 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? %>