Ну и задачку ты подкинул, Танатоз, неделю возился, но зато узнал что такое пользовательские яваскрипты (userJS) и повторил регулярные выражения.
Есть кое-какие результаты, но сначала анализ скрипта из условия.
Я пытался подключить этот скрипт у себя - увы и ах скрипт не заработал. Вот тут для меня случился резкий налом, или я не умею подключать такие скрипты или в скрипте ошибка. После долгих раскопок и чтения я таки нашел ошибку в скрипте. Вот она:
Код:
replacements = [
[/(\w{31,32}\:)([^\s\r]+\:)([^\s\r]+)/mig, '$1$2$3'],
[/(\w{31,32}\:)([^\s\r\:]+$)/mig, '$1$2'], (тут не надо запятой)
];
Там эта зяпятая намекает на продолжение массива. Может этой ошибки и не было в исходном варианте скрипта, но видно Танатоз ты тут что-то подредактировал перед тем как выложить в задании. И вторая (ну это может опечатка или особенности записи скрипта на форум), дело в том что $3 в первой регулярке должtн быть обрамлен тегами цвета (например так [.b]$3[/.b] ставлю тег [.b] для удобства чтения) как и требует условие задачи. Но они то просто выделены красным и при копировании скрипта в буфер обмена, а оттуда в редактор – они не появляются по волшебству. Так вот это сразу не бросается в глаза и пришлось еще и это раскапывать… аналогично вторая регулярка там тоже с карманом $2
Дальше я не сумел перехватывать нажатия клавиш, поэтому занялся основной функцией скрипта (redhesh) эмулируя нажатия шифт энтер просто повесив вызов функции на событие onClick в своей ХТМЛ страничке. Для чистоты экспериментов саму функцию хранил в отдельном js файле и настроил на него OPERA 9.22.
Поехали дальше, анализ регулярных выражений показал что они не будут корректно работать даже с теми хешами которые вроде бы скрипт должен обрабатывать. Я нашел два случая неправильной работы выражений:
1) Для первой регулярки возьмем такие данные:
хеш:логин:пароль т.е. 32(31) это хеш, дальше через : логин и через : пароль.
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:red:red – тут регулярка сработает (32 буквы а, ну и все остальное подходит под регулярку)
НО если взять вот такое, то:
bbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:red:red – регулярка ТОЖЕ сработает, так найдет строку в которой есть 32 буквы а и все остальное по регулярке!!! Почему так, да потому что в регулярке ничего не сказано про то с чего будет начинаться искомое выражение. Т.е. у нас во втором случае идет 4 буквы b дальше все четко по регулярке – 31(32) символа:логин:пароль поэтому регулярка срабатывает и красит что-то левое (а я понял ты в каком-то из постов сказал что нужно четко отличать хеш от нехеша чтобы не красило левак)
Та же штука со второй регуляркой но тут есть еще одна ошибочка.
2) В конце выражения стоит значек $ который обозначает конец строки. Т.е. регулярка сработает если наше выражение будет стоять в конце строки, а это согласитесь нас не устраивает, а что если таких записей больше или мы что-то дописали в конец. Там не достаточно одного этого знака для правильной работы.
Какие из этого всего выводы.
1) Цитата Танатоз:
когда я в тупую делал реплейсы
16, 32, 13
и в тексте были разные хеши, то для хешей в 32 делалась тройная окраска, что не есть гут
Эта ошибка вызвана как раз из-за того что описано в первом случае выше.
Решение:
Код:
/(^|\s)(\w{31,32}\:)([^\s\r]+\:)([^\s\r]+)/mig
– по крайней мере оно учитывает то что искомая строка должна НАЧИНАТЬСЯ либо сначала строки либо с пробелов, а дальше уже 32 символа и т.д.
2) Заканчивать регулярку нужно вот так:
($|\s) т.е. или конец строки или пробел. Причем в самой длинной регулярке там где хеш:логин:пароль этот финал можно опустить. А вот в более коротких нельзя т.к. будет окрашено ненужное.
Результат:
Функция redhash этого скрипта должна выглядеть вот так:
Код:
function redhash(text) {
replacements = [
[/(^|\s)(\w{31,32}\:)([^\s\r]+\:)([^\s\r]+)/mig, ' $2$3<b>$4</b>'],
[/(^|\s)(\w{31,32}\:)([^\s\r\:]+)($|\s)/mig, ' $2<b>$3</b>']
];
s = text;
for( i=0; i < replacements.length; i++) {
s = s.replace(replacements[i][0], replacements[i][1])
}
return s
}
Можем добавить в нее поиск коротких хешей, например 16 символов, тогда:
Код:
replacements = [
[/(^|\s)(\w{31,32}\:)([^\s\r]+\:)([^\s\r]+)/mig, ' $2$3<b>$4</b>'],
[/(^|\s)(\w{31,32}\:)([^\s\r\:]+)($|\s)/mig, ' $2<b>$3</b>'],
[/(^|\s)(\w{16}\:)([^\s\r\:]+)($|\s)/mig, ' $2<b>$3</b>']
];
При таком решении пароли уже не будут окрашены несколько раз.
Для работы теги <b> нужно заменит на необходимые для расцветки.
Если это еще актуально можно улучшить регулярки и полностью доделать задание. Тут например все таки не видно хеш мы нашли или просто какие-то символы заданного количества. Т.е. регулярка не ищет ХЕШ. Ну и конечно нужно тестировать выражения, в том плане что искомые строки могут находиться в разных кусках текста и после разных символов (перевод строки или знак пунктуации например). Опять же можно доделать если актуально остальную часть задания в плане поддержки различных видов записей.
Все. Опять же простите за длину но хотелось поделится впечатлениями от решения задачки. Танатоз СПАСИБО! Супер не скучал неделю.
З.Ы. Потестите кто-нибудь регулярки… может нужно что поменять.