Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Парсер аккордов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Jlblcblu
Отправлено: 18 Марта, 2013 - 23:09:11
Post Id



Новичок


Покинул форум
Сообщений всего: 36
Дата рег-ции: Март 2010  


Помог: 1 раз(а)




Давным давно было интересно и вот теперь стало необходимо написать скрипт, который смог бы выпарсить все аккорды их текста и обернуть условно в какой-нибудь тег, например в span.

Пример: есть самый обычный текст с аккордами.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Вступление: Em
  3.  
  4. C                  G         D                 Em
  5.   Сколько лет прошло, все о том же гудят провода,
  6.                 C       G    D
  7.   Все того же ждут самолеты.
  8. C               G       D               Em
  9.   Девочка с глазами из самого синего льда
  10.               C       G
  11.   Тает под огнем пулемета.
  12. C            G              D
  13.   Должен же растаять хоть кто-то...
  14.  


Начало аккорда всегда такое ~[A-H]~ а вот далее могут быть десятки различных вариантов. Немного погуглив, нашел простенький генератор _http://www.amdm.ru/cgen/_ В нем можно сгенерировать для примера несколько аккордов, чтоб понять что к чему.

Также после основной части может быть а может и не быть "#" и "b" (без кавычек)
Получается что-то вроде ~[A-H]{1}[#b]?~

Погуглив еще чуть-чуть нашел нечто похожее на большинство вариантов, которые могут быть после нашей основной части (тут не все конечно, но все же):
CODE (htmlphp):
скопировать код в буфер обмена
  1. "maj|M|m|min|-|m-5|+3|6|6/9|m6|m6/9|maj7|+7|7+|maj7+|M7|7|dom7|7+5|75+|7/5+|75#|7/5#|7-5|75-|7/5-|75b|7/5b|m7|-7|m+7|m7+|+7+5|m7-5|9|-9|9-|9+|dim|o|0|mb5|m5-|dim7|o7|m6/5-|m7/5-|m75-|m75b|m7b5|aug7|7#5|aug|+|+5|5+|5#|5|-5|5-|5b|mmaj7|m/maj7|min/maj7|m#7|-maj7|sus2|sus4|4|sus|7sus2|7sus4|2|m+|m9|maj9|11|m11|maj11|13|m13|maj13|11+"


Ну а теперь самое главное, соединить все это воедино. И получить вместо наших аккордов из примера (C, G, D и.т.д.) что-то вроде <span class="chord">C</span><span class="chord">G</span><span class="chord">D</span> внутри нашего исходного текста

Кто-нибудь сможет помочь с написанием php-шки? Небольшую функцию для реализации вышеописанного. Может есть люди, которые лучше разбираются в принципах построения аккордов, так и дополнят еще возможными комбинациями.

Заранее спасибо)
 
 Top
nerv
Отправлено: 19 Марта, 2013 - 09:01:43
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




с инглишем работать не будет

CODE (javascript):
скопировать код в буфер обмена
  1. var text = 'Вступление: Em\
  2.                C                  G         D                 Em\
  3.                Сколько лет прошло, все о том же гудят провода,\
  4.                    C       G    D\
  5.                Все того же ждут самолеты.\
  6.                    C               G       D               Em\
  7.                Девочка с глазами из самого синего льда\
  8.                C       G\
  9.                Тает под огнем пулемета.\
  10.                    C            G              D\
  11.                Должен же растаять хоть кто-то...';
  12.  
  13. alert( text.match( /\b[\w#]{1,3}\b/gm ) );


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
Alexandr_Voronin
Отправлено: 19 Марта, 2013 - 10:43:03
Post Id


Новичок


Покинул форум
Сообщений всего: 36
Дата рег-ции: Март 2013  


Помог: 1 раз(а)




ну регулярку я бы составлял след. образом
1. аккорд состоит не более чем из 3ех символов (насколько я помню)
2. может включать в себя английские буквы, цифры и #
3. в твоем примере после аккорда идет много пробелов и строка с аккордами кончается переносом строки.


если нужна помощь в составлении регулярки, напиши, обязательно помогу.
 
 Top
avtor.fox
Отправлено: 19 Марта, 2013 - 11:08:55
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




z-site.ru, Ab maj7?
 
 Top
Alexandr_Voronin
Отправлено: 19 Марта, 2013 - 11:31:52
Post Id


Новичок


Покинул форум
Сообщений всего: 36
Дата рег-ции: Март 2013  


Помог: 1 раз(а)




avtor.fox пишет:
z-site.ru, Ab maj7?


А пардон, о таком аккорде не знал

(Отредактировано автором: 19 Марта, 2013 - 11:41:56)

 
 Top
Jlblcblu
Отправлено: 19 Марта, 2013 - 19:35:42
Post Id



Новичок


Покинул форум
Сообщений всего: 36
Дата рег-ции: Март 2010  


Помог: 1 раз(а)




avtor.fox пишет:
z-site.ru, Ab maj7?


Ну вот и получается, что ~[A-H]{1}[#b]?~ вдобавок одна из частей, перечисленных в длинной строке. И это надо посадить на условие, может быть а может и не быть

Вот мой результат пока. Надо тестировать на сложных аккордах и править.

PHP:
скопировать код в буфер обмена
  1.  
  2. function show_chords($text) {
  3.  $s = "maj|M|m|min|-|m-5|+3|6|6/9|m6|m6/9|maj7|+7|7+|maj7+|M7|7|dom7|7+5|75+|7/5+|75#|7/5#|7-5|75-|7/5-|75b|7/5b|m7|-7|m+7|m7+|+7+5|m7-5|9|-9|9-|9+|dim|o|0|mb5|m5-|dim7|o7|m6/5-|m7/5-|m75-|m75b|m7b5|aug7|7#5|aug|+|+5|5+|5#|5|-5|5-|5b|mmaj7|m/maj7|min/maj7|m#7|-maj7|sus2|sus4|4|sus|7sus2|7sus4|2|m+|m9|maj9|11|m11|maj11|13|m13|maj13|11+";
  4.  $s = preg_replace('~\+~', '\\+', $s);
  5.  $text = preg_replace(
  6.     '~([A-H]{1}[#b]?)('.$s.')?(add[0-9]{1,2})*~',
  7.     '<span class="chord">$1$2$3</span>',
  8.     $text);
  9.  
  10.  return $text;
  11.  }
  12.  


Ну вот и косяки Em5- не выпарсился. Хотя |m5-| есть в списке. Что не так?

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. H                     Em
  3. Спину ломит, голова болит,
  4. H                      Em
  5. То ли клещ засел энцефалит?
  6. Am                       C
  7. В голове болит последний зуб,
  8. H                          Em
  9. Мы болеем за один и тот же клуб.
  10.  
  11. Проигрыш: Em | Em5-
  12.  
  13. Чуть курнул - и сразу бледный вид,
  14.  

(Отредактировано автором: 19 Марта, 2013 - 20:40:50)

 
 Top
Alexandr_Voronin
Отправлено: 20 Марта, 2013 - 13:17:07
Post Id


Новичок


Покинул форум
Сообщений всего: 36
Дата рег-ции: Март 2013  


Помог: 1 раз(а)




Jlblcblu Регулярка видит в перечислении "maj|M|m| и на нем и останавливается поэтому Em5- не выделяется.
 
 Top
DlTA
Отправлено: 20 Марта, 2013 - 13:44:24
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Jlblcblu пишет:
Вступление: Em
 
C                  G         D                 Em
  Сколько лет прошло, все о том же гудят провода,

а где используются подобные файлы?
 
 Top
Jlblcblu
Отправлено: 20 Марта, 2013 - 22:48:37
Post Id



Новичок


Покинул форум
Сообщений всего: 36
Дата рег-ции: Март 2010  


Помог: 1 раз(а)




z-site.ru пишет:
Jlblcblu Регулярка видит в перечислении "maj|M|m| и на нем и останавливается поэтому Em5- не выделяется.


Как выяснилось, это действительно так. Жаль что дальше по условию "или" не идет. таким образом, исправить это можно переместив в той длинной строке окончания аккордов. Расставить по приоритету, что ли. Готовый вариант выложу чуть позже, если интересно. Но остается проблема с английскими текстами. Таким образом, придется или форматировать исходные тексты, либо довольствоваться тем что есть.

DlTA пишет:
а где используются подобные файлы?

Это самые обычные аккорды для игры на гитаре. По интернету их десятки тысяч.

З.Ы.
А есть предложения, каким бы образом улучшить алгоритм подсветки аккордов?) Все-таки на форуме наверняка есть люди, опыт которых превышает мой в разы.
 
 Top
NoPaper
Отправлено: 21 Марта, 2013 - 09:42:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 315
Дата рег-ции: Янв. 2012  
Откуда: Минск


Помог: 9 раз(а)




Jlblcblu, как вам такое решение?
PHP:
скопировать код в буфер обмена
  1.  
  2. $chords = array(/*Массив со всевозможными аккордами*/);
  3. rsort($chords);
  4.  
  5. $text = "
  6. H                     Em
  7. Спину ломит, голова болит,
  8.  
  9. H                      Em
  10. То ли клещ засел энцефалит?
  11.  
  12. Am                       C
  13. В голове болит последний зуб,
  14.  
  15. H                          Em
  16. Мы болеем за один и тот же клуб.
  17.  
  18. Проигрыш: Em | Em5-
  19.  
  20. Чуть курнул - и сразу бледный вид,";
  21.  
  22.  
  23. echo preg_replace('/\s('.implode('|',$chords).')/', '<span class="chord">\\1</span>',$text);
  24.  


Вот спарсил с музыкального сайта аккорды для гитар:
Спойлер (Отобразить)

(Отредактировано автором: 21 Марта, 2013 - 09:48:37)

 
 Top
Jlblcblu
Отправлено: 21 Марта, 2013 - 14:07:02
Post Id



Новичок


Покинул форум
Сообщений всего: 36
Дата рег-ции: Март 2010  


Помог: 1 раз(а)




NoPaper, действительно хороший вариант. Не надо выдумывать правила. В случае если нет какого-либо аккорда - легко обновить внесением в список, каким бы специфичным он ни являлся.

Но все прошло не очень гладко. Например:
1) Если аккорд начинается с 1 элемента строки, т.е. без пробела вначале - косяк
2) Также почему-то это парсинг выкосил переносы строк (по умолчанию текст располагается в теге pre, дабы соблюдать легко форматирование)
3) Английский текст страдает.

CODE (htmlphp):
скопировать код в буфер обмена
  1. Em           D         C
  2. So close no matter how far
  3. Couldn't be much more from the heart
  4. Forever trusting who we are
  5. G   Н7          Em
  6. And nothing else matters
  7.  


Если предположить, что пробелы вначале исправить как-то можно, то вот что делать с английским текстом.

Есть идея такого вида, правда с реализацией пока не очень. А именно: Во-первых не заменять вначале \s на пробел. Это реально ломает некоторые тексты. Во-вторых - проверять наличие пробела или переноса строки после аккорда. Имхо - это избавит от проблем некоторых.

Можете подсказать как проверить условие нахождения символов в конце?
Или есть лучше варианты?

(Отредактировано автором: 21 Марта, 2013 - 14:49:57)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB