【问题标题】:RegEx problem or maybe another solution altogether?正则表达式问题或者可能是另一种解决方案?
【发布时间】:2011-02-11 22:40:20
【问题描述】:

我遇到的问题是我已经成功地从网站源中抓取了一段 JavaScript,现在我必须进行筛选以获取我正在寻找的特定值。

我需要找到flvFileName 并获取所有列出的文件名。在这种情况下,它是'trailer1,trailer2,trailer3'

起初我开始使用正则表达式来匹配开始和结束标签,然后匹配文件名并将它们提取到一个数组中,但问题是列表中并不总是三个视频。可能有零个或多个,因此匹配不起作用。关于解决这个问题的任何想法不会让我继续滥用我的笔记本电脑?

... ,flashvars: {flvFileName: 'trailer1,trailer2,trailer3', age: 'no', isForced: 'true'} }); });

【问题讨论】:

  • 这是一个缺少最后一个 ']' 的数组还是一个字符串?
  • 示例 JavaScript 真的很难阅读,所以我将它截断到目标数据之前和之后的部分。原始示例可在修订历史记录中找到。

标签: javascript ruby regex scrape


【解决方案1】:

假设它是一个字符串(或者你可以把它变成一个字符串)

p str.split(/flvFileName: '|', age/)[1].split(',')
#=> ["trailer1", "trailer2", "trailer3"]

这会将事物分成三部分:

  • flvFileName: ' 之前的所有内容
  • 好东西
  • '、年龄之后的所有内容

然后用逗号分隔好东西。

【讨论】:

  • 优秀的答案,我觉得不建议这种字符串操作反而很愚蠢。我通常是这样做的人。 +1
【解决方案2】:

您可以尝试使用RKelly 为您将 JavaScript 解析为 Ruby。

或者,由于 Aaron 似乎有 abandoned RKelly,您可以尝试替换它,Johnson

【讨论】:

  • 我并不需要真正进行 JS 到 Ruby 的转换。我只需要读取输出,因为占位符在页面加载时被渲染到 JS 中,因此仅解析 HTML 页面就足够了。我确实读过 RKelly 和 Johnson。我相信我会在不久的将来再次访问约翰逊。
【解决方案3】:

比如:\bflvFileName\s*:\s*("|')(?:\s*([^,\1\s]+)\s*,?)+(?<!,)\s*\1

你可能不得不转义那些反斜杠;我不知道 Ruby,但你会在 .NET 中。注意反向引用;就是上面的\1。我用它来表示文件名包含在匹配的 "' 字符中。

所有\s 可能都是不必要的,但我将它们留在那里以便彻底。我假设特殊字符(:", 等)周围可能有任意数量的空格。 YMMV。

另外:([^,\1\s]+) 可能过于宽泛,无法描述文件名,具体取决于您认为有效的内容。您可能想改用((?:\w|\.)+)

如果以上内容难以理解,请提供一些参考信息: regular-expressions.info/reference.html

【讨论】:

    【解决方案4】:

    如果你用旧的方式来做呢?

    start = string.index(flvFileName)
    quoteStart = string.index("'", start)
    quoteEnd = string.index("'", quoteStart)
    trailersString = string.slice(quoteStart, quoteEnd)
    trailers = string.split(",")
    

    它并不漂亮,但它确实有效。当没有预告片时,您可能需要为这种情况做一些特别的事情。

    【讨论】:

    • 我编辑了您的答案以删除称呼。 StackOverflow 不希望我们在问题和答案中使用称呼、告别词或签名。
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    相关资源
    最近更新 更多