Проблема RegEx или, может быть, другое решение вообще? - PullRequest
1 голос
/ 12 февраля 2011

Проблема, с которой я столкнулся, заключается в том, что у меня есть блок JavaScript, который я успешно вычеркнул из источника веб-сайтов, и теперь мне нужно просмотреть его, чтобы получить конкретные значения, которые я ищу.

Мне нужно найти flvFileName и получить все перечисленные имена файлов. В этом случае это 'trailer1,trailer2,trailer3'.

Сначала я начал использовать регулярные выражения, чтобы сопоставить начальный и конечный теги, а затем сопоставить имена файлов и извлечь их в массив, но проблема в том, что в списке не всегда три видео. Может быть ноль или больше, поэтому сопоставление не работает. Есть какие-нибудь мысли о том, как подойти к этому, что не заставит меня продолжать злоупотреблять моим ноутбуком?

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

Ответы [ 4 ]

2 голосов
/ 12 февраля 2011

Предполагая, что это строка (или вы можете получить ее как строку)

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

Это разделит вещь на 3 части:

  • все до flvFileName: '
  • хорошие вещи
  • все после ', возраст

Затем разделите хорошие вещи на запятую.

2 голосов
/ 12 февраля 2011

Вы можете попробовать использовать RKelly для анализа JavaScript в Ruby для вас.

Или, поскольку Аарон, похоже, отказался от RKelly , вы можете попробовать заменить его. Джонсон .

1 голос
/ 12 февраля 2011

Как насчет чего-то вроде: \bflvFileName\s*:\s*("|')(?:\s*([^,\1\s]+)\s*,?)+(?<!,)\s*\1

Возможно, вам придется избежать этих обратных наклонностей; Я не знаю о Руби, но вы бы в .NET. Обратите внимание на обратную ссылку; это \1 выше. Я использую его, чтобы указать, что имена файлов заключены в соответствующие " или ' символы.

Все \s могут быть ненужными, но я оставляю их там для тщательности. Я предполагаю, что вокруг специальных символов может быть любое количество пробелов (:, ", , и т. Д.). YMMV.

Также: ([^,\1\s]+) может быть слишком широким для описания имен файлов, в зависимости от того, что вы считаете допустимым. Вы можете вместо этого использовать ((?:\w|\.)+).

Некоторая справочная информация, если вышеперечисленное трудно понять: regular-expressions.info / reference.html

1 голос
/ 12 февраля 2011

Что если вы сделаете это по-старому?

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

это не красиво, но работает. И вам может потребоваться сделать что-то особенное для случая, когда нет трейлера.

...