Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 正则表达式匹配生成部分无效输出的URL_Ruby_Regex_Url - Fatal编程技术网

Ruby 正则表达式匹配生成部分无效输出的URL

Ruby 正则表达式匹配生成部分无效输出的URL,ruby,regex,url,Ruby,Regex,Url,我试图在我的Ruby应用程序中使用以下正则表达式代码来匹配HTTP链接,但它会生成无效的输出,在链接后面附加一个句点,有时是一个句点和一个单词,当在web上进行测试时,该链接将变为无效 URL_PATTERN = Regexp.new %r{http://[\w/.%-]+}i <input>.to_s.scan( URL_PATTERN ).uniq URL\u PATTERN=Regexp.new%r{http://[\w/%-]+}i .to_.scan(URL_模式).u

我试图在我的Ruby应用程序中使用以下正则表达式代码来匹配HTTP链接,但它会生成无效的输出,在链接后面附加一个句点,有时是一个句点和一个单词,当在web上进行测试时,该链接将变为无效

URL_PATTERN  = Regexp.new %r{http://[\w/.%-]+}i
<input>.to_s.scan( URL_PATTERN ).uniq
URL\u PATTERN=Regexp.new%r{http://[\w/%-]+}i
.to_.scan(URL_模式).uniq
上面扫描链接的代码有问题吗

应用程序中的代码:

require 'bundler/setup'
require 'twitter'

RECORD_LIMIT = 100
URL_PATTERN  = Regexp.new %r{http://[\w/.%-]+}i

def usage
  warn "Usage: ruby #{File.basename $0} <hashtag>"  
  exit 64
end

# Ensure that the hashtag has a hash symbol. This makes the leading '#'
# optional, which avoids the need to quote or escape it on the command line.
def format_hashtag(hashtag)  
  (hashtag.scan(/^#/).empty?) ? "##{hashtag}" : hashtag
end

# Return a sorted list of unique URLs found in the list of tweets.
def uniq_urls(tweets)  
  tweets.map(&:text).grep( %r{http://}i ).to_s.scan( URL_PATTERN ).uniq
end

def search(hashtag)  
  Twitter.search(hashtag, rpp: RECORD_LIMIT, result_type: 'recent')
end

if __FILE__ == $0 usage unless ARGV.size >= 1  
hashtag = format_hashtag(ARGV[0]) 
tweets = search(hashtag) 
puts uniq_urls(tweets)
end
需要“捆绑机/设置”
需要“推特”
记录限制=100
URL_PATTERN=Regexp.new%r{http://[\w/%-]+}i
def使用
警告“用法:ruby{File.basename$0}”
出口64
结束
#确保hashtag具有哈希符号。这就形成了领先的“#”
#可选,避免在命令行中引用或转义它。
def格式\u标签(标签)
(hashtag.scan(/^#/)。空?)?“##{hashtag}”:hashtag
结束
#返回在tweet列表中找到的唯一URL的排序列表。
def uniq_URL(推文)
tweets.map(&:text).grep(%r{http://}i).to_.scan(URL_PATTERN).uniq
结束
def搜索(标签)
搜索(hashtag,rpp:RECORD\u LIMIT,result\u type:'recent')
结束
如果_文件_==0,除非ARGV.size>=1
hashtag=格式\u hashtag(ARGV[0])
tweets=搜索(标签)
放置uniq_URL(推文)
结束
TL;博士 人们总是发布坏链接。链接也会受到位腐蚀的影响

可能的答案 您是否手动验证推文?您确定原始推文没有包含格式错误的URL吗?如果有人发帖:

还要烤面包吗

那么您肯定会得到一个无效的结果,因为正则表达式要求URL周围有空格。如果你想删减无效的结果,那么你需要使用一个链接检查器,它可以处理重定向来验证你找到的每个链接

作者免责声明 你发布的代码是我的,来自。我故意忽略了链接检查,因为我感兴趣的是提取URL,而不是验证它们

“这对我很管用;你的里程可能会有所不同。”℠

TL;博士 人们总是发布坏链接。链接也会受到位腐蚀的影响

可能的答案 您是否手动验证推文?您确定原始推文没有包含格式错误的URL吗?如果有人发帖:

还要烤面包吗

那么您肯定会得到一个无效的结果,因为正则表达式要求URL周围有空格。如果你想删减无效的结果,那么你需要使用一个链接检查器,它可以处理重定向来验证你找到的每个链接

作者免责声明 你发布的代码是我的,来自。我故意忽略了链接检查,因为我感兴趣的是提取URL,而不是验证它们


“这对我很管用;你的里程可能会有所不同。”℠

问题在于正则表达式将包含一个尾随句点,因为您正在不加区别地检查任意序列的单词字符、斜杠、百分号、连字符(又称“减号”)和句点。这将捕获一个尾随句点,当URL位于句子末尾时,它实际上是标点符号,如果人们省略句点后的空格,则省略句点后的任何内容。您可以通过排除像这样的尾随标点符号来部分缓解此问题(注意,这仍然会捕获标点符号后面紧跟着非URL内容):

但是,这仍然会丢失大部分现有URL,并捕获大量无效内容:。如果你想要一个完美的匹配,约翰·格鲁伯(John Gruber)发布了一篇文章,内容是关于今天用作URL的任何内容的匹配,而不仅仅是http(s)内容。为了更精确地匹配大量纯web URL(包括HTTPS变体),确保在开始时有一个格式良好的域,并捕获查询和片段标识符,正则表达式应该如下所示:

https?://[\w-]+(?:\.[\w-]+)+(?:/[\w-]+)*(?:(?:[./%?=&#-]\w+)+)?

–这仍然会捕获无效的内容,并排除相当多的现有URL(以及更大比例的有效URL,请参阅上文链接的RFC),但它会让您更接近。

问题是,您的正则表达式将包含一个尾随句点,因为您不分青红皂白地检查任意序列的单词字符、斜杠、,百分号、连字符(又称“减号”)和句点。这将捕获一个尾随句点,当URL位于句子末尾时,它实际上是标点符号,如果人们省略句点后的空格,则省略句点后的任何内容。您可以通过排除像这样的尾随标点符号来部分缓解此问题(注意,这仍然会捕获标点符号后面紧跟着非URL内容):

但是,这仍然会丢失大部分现有URL,并捕获大量无效内容:。如果你想要一个完美的匹配,约翰·格鲁伯(John Gruber)发布了一篇文章,内容是关于今天用作URL的任何内容的匹配,而不仅仅是http(s)内容。为了更精确地匹配大量纯web URL(包括HTTPS变体),确保在开始时有一个格式良好的域,并捕获查询和片段标识符,正则表达式应该如下所示:

https?://[\w-]+(?:\.[\w-]+)+(?:/[\w-]+)*(?:(?:[./%?=&#-]\w+)+)?

–这仍然会捕获无效的内容,并排除相当多的现有URL(以及更大比例的有效URL–请参阅上面链接的RFC),但它会让您更接近。

与其重新发明轮子,为什么不使用Ruby?它和红宝石捆绑在一起

从文件中:

Synopsis URI::extract(str[, schemes][,&blk]) Args str String to extract URIs from. schemes Limit URI matching to a specific schemes. Description Extracts URIs from a string. If block given, iterates through all matched URIs. Returns nil if block given or array with matches. Usage require "uri" URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.") # => ["http://foo.example.com/bla", "mailto:test@example.com"] 提要 URI::extract(str[,schemes][,&blk]) Args 要从中提取URI的str字符串。 方案限制URI与特定方案的匹配。 描述 从字符串中提取URI。如果给定块,则遍历所有匹配的URI。如果给定的块或数组匹配,则返回nil。 用法 需要“uri” extract(“此处为文本http://foo.example.org/bla 这里寄到:test@example.com这里也是。”) # => ["http://foo.example.com/bla“,”邮寄至:test@example.com"] 如果您只需要HTTP URL:

[3] (pry) main: 0> URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.", %w[http]) => ["http://foo.example.org/bla"] [3] (pry)main:0>URI.extract(“此处的文本http://foo.example.org/bla 这里寄到:test@example.com这里也是。”,%w[http]) =>[“http://