RegEx 问题或者可能是另一种解决方案?

问题描述 投票:0回答:4

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

我需要找到

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

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

... ,flashvars: {flvFileName: 'trailer1,trailer2,trailer3', age: 'no', isForced: 'true'} }); });
javascript regex ruby web-scraping
4个回答
2
投票

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

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

这会将事情分成三部分:

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

然后把好东西用逗号分开。


2
投票

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

或者,由于 Aaron 似乎已经放弃了 RKelly,你可以尝试它的替代品,Johnson


1
投票

怎么样:

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

您可能必须转义那些反斜杠;我不了解 Ruby,但你会了解 .NET。注意反向引用;就是上面的

\1
。我用它来指示文件名包含在匹配的
"
'
字符中。

所有的

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

另外:

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

如果以上内容难以理解,一些参考信息: 正则表达式.info/reference.html


1
投票

如果用老方法怎么办?

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

它并不漂亮,但很有效。当没有预告片时,您可能需要对案例做一些特殊的事情。

© www.soinside.com 2019 - 2024. All rights reserved.