我遇到的问题是,我已经成功地从网站源代码中抓取了一段 JavaScript,现在我必须进行筛选才能获得我正在寻找的特定值。
我需要找到
flvFileName
并获取列出的所有文件名。在这种情况下,它是'trailer1,trailer2,trailer3'
。
起初我开始使用正则表达式来匹配开始和结束标签,然后匹配文件名并将它们提取到数组中,但问题是列表中并不总是三个视频。可能有零个或多个,因此匹配不起作用。 有什么想法可以解决这个问题,不会让我继续滥用我的笔记本电脑?
... ,flashvars: {flvFileName: 'trailer1,trailer2,trailer3', age: 'no', isForced: 'true'} }); });
假设它是一个字符串(或者你可以让它成为一个字符串)
p str.split(/flvFileName: '|', age/)[1].split(',')
#=> ["trailer1", "trailer2", "trailer3"]
这会将事情分成三部分:
然后把好东西用逗号分开。
您可以尝试使用 RKelly 将 JavaScript 解析为 Ruby。
或者,由于 Aaron 似乎已经放弃了 RKelly,你可以尝试它的替代品,Johnson。
怎么样:
\bflvFileName\s*:\s*("|')(?:\s*([^,\1\s]+)\s*,?)+(?<!,)\s*\1
您可能必须转义那些反斜杠;我不了解 Ruby,但你会了解 .NET。注意反向引用;就是上面的
\1
。我用它来指示文件名包含在匹配的 "
或 '
字符中。
所有的
\s
可能都是不必要的,但我将它们留在那里是为了彻底。我假设特殊字符周围可能有任意数量的空格(:
、"
、,
等)。 YMMV.
另外:
([^,\1\s]+)
对于描述文件名可能过于宽泛,具体取决于您认为有效的内容。您可能想使用 ((?:\w|\.)+)
来代替。
如果以上内容难以理解,一些参考信息: 正则表达式.info/reference.html
如果用老方法怎么办?
start = string.index(flvFileName)
quoteStart = string.index("'", start)
quoteEnd = string.index("'", quoteStart)
trailersString = string.slice(quoteStart, quoteEnd)
trailers = string.split(",")
它并不漂亮,但很有效。当没有预告片时,您可能需要对案例做一些特殊的事情。