Dies ist eine alte, aber gute Frage. Hier ist eine Antwort, die sich auf den in Ruby eingebauten URI stützt:
require 'set'
require 'uri'
text = '@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3'
schemes_regex = /^(?:#{ URI.scheme_list.keys.join('|') })/i
URI.extract(text).each do |url|
text.gsub!(url, '') if (url[schemes_regex])
end
puts text.squeeze(' ')
Und ein Durchlauf durch IRB, der zeigt, was passiert und was dabei herauskommt:
Ich habe den zu suchenden Text definiert:
irb(main):004:0* text = '@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3'
=> "@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands http://news.bnonews.com/u4z3"
Ich habe eine Regex von URI-Schemata definiert, auf die wir reagieren wollen. Dies ist ein defensiver Schritt, da URI in seinem Suchschritt ein falsch-positives Ergebnis liefert:
irb(main):006:0* schemes_regex = /^(?:#{ URI.scheme_list.keys.join('|') })/i
=> /^(?:FTP|HTTP|HTTPS|LDAP|LDAPS|MAILTO)/i
Lassen Sie URI durch den Text gehen, um URLs zu finden. Für jede gefundene, wenn es ein Schema, das wir wollen, um zu reagieren, entfernen Sie alle seine Vorkommen aus dem Text:
irb(main):008:0* URI.extract(text).each do |url|
irb(main):009:1* text.gsub!(url, '') if (url[schemes_regex])
irb(main):010:1> end
Dies sind die URLs URI.extract
gefunden. Sie meldet fälschlicherweise BreakingNews:
wegen der hinteren :
. Ich denke, es ist nicht zu anspruchsvoll, aber für den normalen Gebrauch ist es in Ordnung:
=> ["BreakingNews:", "http://news.bnonews.com/u4z3"]
Zeigen Sie, wie der resultierende Text aussah:
irb(main):012:0* puts text.squeeze(' ')
@BreakingNews: Typhoon Morakot hits Taiwan, China evacuates thousands