WedX - журнал о программировании и компьютерных науках

Соответствие с javascript

В настоящее время я разрабатываю веб-интерфейс для XBMC, который содержит ajax. Из-за ограничений внешнего ajax я был вынужден использовать локальные ресурсы вместо моего класса ajax, который обычно генерирует вывод. У меня есть строка. * означает, что этот текст может измениться.

Это строка:

Имя файла:smb://SERVER/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 PlayStatus:Playing SongNo:6 Type:Audio Title:Better Life Track:7 Исполнитель:3 Doors Down Альбом:The Better Life Жанр:Alternative Год:2000 URL:smb://xbox:xbox@SERVER/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 Текст песни: Битрейт: 193 Частота дискретизации: 44 Thumb: DefaultAlbumCover.png Время: 02 :05 Продолжительность:03:07 Процент:66 Размер файла:4509417 Изменено:False

Я хочу знать, как я могу сопоставить Title, Arist, Time и Duration. Я пробовал с регулярным выражением, но безуспешно, потому что у меня не так много знаний JS.

Спасибо, Брантье.

РЕДАКТИРОВАТЬ: «Вы уверены, что это строка? Все работает вместе, без новых строк? Редактировать: я отредактировал вопрос, чтобы исправить форматирование. — Ариэль 2 часа назад»

Нет, вывод из https://xbox/xbmcCmds/xbmcHttp?command=GetCurrentlyPlaying выглядит следующим образом. при воспроизведении видео

HTML-код:

<html> 
<li>Filename:smb://SERVER/Movies/Drive Angry/Drive Angry (2011) DVDRip XviD-MAXSPEED.avi
<li>PlayStatus:Playing
<li>VideoNo:0
<li>Type:Video
<li>Thumb:DefaultVideoCover.png
<li>Time:00:00:28
<li>Duration:01:44:31
<li>Percentage:0
<li>File size:1666804442
<li>Changed:False</html> 

При воспроизведении музыки все немного по-другому.

<html> 
<li>Filename:smb://SERVER/Music/3 Doors Down/2000 The Better Life/01 Kryptonite.mp3
<li>PlayStatus:Playing
<li>SongNo:-1
<li>Type:Audio
<li>Title:Kryptonite
<li>Track:1
<li>Artist:3 Doors Down
<li>Album:The Better Life
<li>Genre:Alternative
<li>Year:2000
<li>URL:smb://xbox:xbox@SERVER/Music/3 Doors Down/2000 The Better Life/01 Kryptonite.mp3
<li>Lyrics:
<li>Bitrate:192
<li>Samplerate:44
<li>Thumb:DefaultAlbumCover.png
<li>Time:00:05
<li>Duration:03:54
<li>Percentage:2
<li>File size:5618471
<li>Changed:False</html> 
19.07.2011

  • Вы могли бы использовать JSON? Пожалуйста? 20.07.2011
  • Из-за ограничений ajax я был вынужден использовать локальные ресурсы вместо моего класса ajax, который обычно генерирует вывод. - Вы можете это объяснить? 20.07.2011
  • @slandau обычно означает ограничения разработчика;) 20.07.2011
  • Вы уверены, что это струна? Все работает вместе, как это без новых строк? Изменить: я отредактировал вопрос, чтобы исправить форматирование. 20.07.2011
  • ржу не могу. я не знаю, какие ограничения у AJAX есть у Брантье. Все, что вы можете сделать на сервере, вы можете сделать с помощью AJAX — просто позвоните! Кроме того, как сказал Мэтт Болл, вы должны возвращать информацию в формате JSON, и с этим вы можете легко отделить свойства и получить к ним доступ во внешнем интерфейсе. 20.07.2011
  • Люди, перестаньте пытаться отформатировать строку как код. Ты просто продолжаешь все портить. 20.07.2011
  • @slandau Я редактирую текущий интерфейс XBMC, чтобы он показывал, что сейчас воспроизводится, громкость и т. д. lwburk, я ограничен выводом wiki.xbmc.org/index.php?title=Web_Server_HTTP_API API веб-сервера XBMC 20.07.2011

Ответы:


1

Предполагая следующую строку:

var str = "Filename:smb://SERVER/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 PlayStatus:Playing SongNo:6 Type:Audio Title:Better Life Track:7 Artist:3 Doors Down Album:The Better Life Genre:Alternative Year:2000 URL:smb://xbox:xbox@SERVER/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 Lyrics: Bitrate:193 Samplerate:44 Thumb:DefaultAlbumCover.png Time:02:05 Duration:03:07 Percentage:66 File size:4509417 Changed:False";

Извлеките свойства в словарь/карту:

var dict = (" " + str).split(/ (\w+):/).reduce(function(acc, el, i, orig) {
    if (i % 2)
        acc[el] = orig[i + 1];
    return acc;
}, {});

Вот то же самое без функции высшего порядка:

var i, dict = {}, pair = (" " + str).split(/ (\w+):/);
for (i = 1; i < pair.length; i += 2)
    dict[pair[i]] = pair[i + 1];

Получение значений теперь тривиально:

console.log(dict["Title"]);
console.log(dict["Artist"]);
console.log(dict["Time"]);
console.log(dict["Duration"]);

Выход:

Better Life
3 Doors Down
02:05
03:07
19.07.2011

2

Вот как я это сделал с регулярными выражениями:

var data = "Filename:smb://SERVER/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 PlayStatus:Playing SongNo:6 Type:Audio Title:Better Life Track:7 Artist:3 Doors Down Album:The Better Life Genre:Alternative Year:2000 URL:smb://xbox:xbox@SERVER/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 Lyrics: Bitrate:193 Samplerate:44 Thumb:DefaultAlbumCover.png Time:02:05 Duration:03:07 Percentage:66 File size:4509417 Changed:False";

function matchField(field, str) {
    // regexp: space, field, colon, (fewest number of chars), space, fewest number of non-whitespace chars, colon
    var re = new RegExp("\\s" + field + ":(.+?)\\s\\S+?:");
    try {
        return(str.match(re)[1]);
    } catch(e) {}
    return("");
}

var songTitle = matchField("Title", data);
var artist = matchField("Artist", data);
var duration = matchField("Duration", data);

И вы можете увидеть это в действии здесь: https://jsfiddle.net/jfriend00/Y9g7x/.

Результаты:

Title: Better Life
Artist: 3 Doors Down
Duration: 03:07

Я думаю, что на самом деле можно сделать все это с помощью одного регулярного выражения, но это заставит порядок разных полей каждый раз быть точно таким же.

19.07.2011
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]