[javascript] помогите дописать скрипт с регулярными выражениями

Discussion in 'PHP' started by Thanat0z, 14 Aug 2007.

  1. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    Ниже вы можете видеть скрипт для браузера, который по нажатию Shift+Enter преобразует строку в форме ввода (в форме быстрого ответа для отправки текста)

    из
    04b2539eecc816ecb9af7adb9ce60493:пароль
    в
    Code:
    04b2539eecc816ecb9af7adb9ce60493:[color=red]пароль[/color]
    То есть текст после последнего двоточия выделятся красным цветом.

    Что нужно
    1) чтоб он корректно воспринимал DES и mysql3 хеши 2) тоже самое для freebsd md5
    3) корректная работа с записями
    хеш:пароль
    логин:хеш:пароль
    хеш:соль:пароль
    логин:хеш:соль:пароль

    От чего можно отталкиваться

    Mysql - 16 символов
    Как и md5 состоит из символов abcdef0987654321

    DES - 13 символов

    freebsd md5 - 32 символа (пример $1$12345678$tDiEmRj8eI0HYEz5Z9P3L/)
    Начинается с $1, между $ идет соль до 8 символов (выделил синим цветом), далее 22 символа

    ЗЫ для сальтовых мд5 соль обычно 3 или 5 символов, но пока и без этих заморочек стабильно работает

    Сам не шарю, на многое не способен

    Code:
    // Ctrl+Enter RedHash Submits
    // version 0.2
    // 09.08.2007
    // Это Greasemonkey user script.
    // Скачать Greasemonkey можно тут: http://greasemonkey.mozdev.org/
    // Инсталируйте Greasemonkey
    // В вкладке Tools будет новое меню "Install User Script".
    // Инсталируте скрипт с дефолтными настройками
    // Тестировалось с https://addons.mozilla.org/ru/firefox/downloads/file/16465/greasemonkey-0.7.20070607.0-fx.xpi
    // --------------------------------------------------------------------
    // Opera 8/9 совместимый скрипт.
    // Для инсталяции разместите скрипт в какой-то папке и укажите к ней путь как к папке с пользовательскими скриптами
    // Tools > Preferences > Advanced > Content > Javascript Options
    // для https в Опере нужно специальное разрешение 
    // opera:config#UserPrefs|UserJavaScriptonHTTPS
    // ---------------------------------------------------------------------
    // тестировалось на Firefox 2.0 и Opera 9.21
    // ---------------------------------------------------------------------
    // ==UserScript==
    // @name          Ctrl+Enter RedHash Submits
    // @description   Allows submitting on Ctrl+Enter in any input and textarea
    // @include        *
    // ==/UserScript==
    
    function redhash(text) {
    
        replacements = [
    
      [/(\w{31,32}\:)([^\s\r]+\:)([^\s\r]+)/mig, '$1$2[color=red]$3[/color]'],
      [/(\w{31,32}\:)([^\s\r\:]+$)/mig, '$1[color=red]$2[/color]'],
    
        ];
    
        s = text
        for( i=0; i < replacements.length; i++) {
    	s = s.replace(replacements[i][0], replacements[i][1])
        }
        
        return s
    }
    
    function trigger_submit_on_ctrl_enter(e) {
        if ((e.keyCode==13) && (e.ctrlKey || e.shiftKey)) {
    	p = this.parentNode
    	i = 0
    	if (this.nodeName == 'TEXTAREA')
    	    this.value = redhash(this.value)
    
    	while (p.nodeName != 'FORM' && i++ < 100) 
    	    p = p.parentNode
    
    	if (p.nodeName == 'FORM' && e.ctrlKey) 
    	    p.submit()
        }
    }
    
    if (document.evaluate) { // Firefox
        allInps = document.evaluate("//textarea[not(@id='instant_comment_textarea')] | //select | //input", document, null, 
    				    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        for (var i = 0; i < allInps.snapshotLength; i++) {
    	t = allInps.snapshotItem(i);
    	t.addEventListener("keydown", trigger_submit_on_ctrl_enter, 0);
        }
    } else { // Opera 8 does not support XPath
        elemTags = ['textarea', 'select', 'input']
        for(j = 0; j< elemTags.length; j++) {
    	inps = document.getElementsByTagName(elemTags[j])
    	for (var i = 0; i < inps.length; i++)
    	    inps[i].addEventListener("keydown", trigger_submit_on_ctrl_enter, 0);
        }
    }
     
    #1 Thanat0z, 14 Aug 2007
    Last edited: 22 Aug 2007
    1 person likes this.
  2. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    делаю ап. Кто следелает хотя бы корректное распознавание хеша по длине в

    13, 16, 31-32, 40

    тому +20
     
  3. Basurman

    Basurman Elder - Старейшина

    Joined:
    10 Nov 2006
    Messages:
    363
    Likes Received:
    271
    Reputations:
    29
    добавить имхо в replacements = [

    Code:
    [/(\w{16}\:)([^\s\r\:]+$)/mig, '$1$2'],
    - mysql (это к примеру)
    для DES туда надо вписывать спец. символы (слеши, точки и тд)

    Пока не проверить, надо скачивать гризмонкей и тд

    Точно так же делаются:
     
    #3 Basurman, 21 Aug 2007
    Last edited: 22 Aug 2007
    2 people like this.
  4. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    когда я в тупую делал реплейсы

    16, 32, 13

    и в тексте были разные хеши, то для хешей в 32 делалась тройная окраска, что не есть гут
     
  5. Basurman

    Basurman Elder - Старейшина

    Joined:
    10 Nov 2006
    Messages:
    363
    Likes Received:
    271
    Reputations:
    29
    кстати а нафига там
    Code:
    [/(\w{31,32}\:)([^\s\r]+\:)([^\s\r]+)/mig, '$1$2$3'],
    это получается 32симв:непробелнеCR:непробелнеCR :)
    Типа соль? :)

    P.S. ок, сейчас посмотрю поставлю
     
    #5 Basurman, 21 Aug 2007
    Last edited: 21 Aug 2007
  6. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    да, скрипт задумывался для работы без логина, но пока проблем не было
     
  7. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Танатоз хочу уточнить что будет входнымы данными для скрипта. Т.е. какого вида будет переменная (text) в function redhash(text). Это будет текст вида
    в любых сочетаниях, или же ЛЮБОЙ текст в котором встречаються записи вида хеш:пароль и т.д. по условию задачи и уже в этом тексте нужно найти записи, определить что из них какой хеш и только тогда подсветить пароль.
    Читая пост я понял что основное это
    У меня есть скрипт на ПХП который может взять файл вида
    в любых сочетаниях, и на выходе создать файл с подсвечеными паролями. Если это оно могу выложить. Если не так понял задачку сильно не бить, лучше раскажите что не так понял.
     
    1 person likes this.
  8. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    нужен яваскрипт, чтоб на стороне клиента делать действия

    ЗЫ если грубо взять, то надо выделять текст именно после последнего двоеточия, тут правильно заметил
     
  9. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Танатоз есть такая штука
    Code:
    Исходный текст<br>
     aaaaaaaa:bbbb!cbbb sdfsdfs     sdf   aaaaaa aa:yb@#%$%bbbbbaaaaaaaa:ybbbbbb aaaaaaaa:ubbbb@%^bb aaaaaaaa:ibbbbbb Привет Мир!Я делаю скрипт....         aaaaaaa:ibbbbbb 
    <br>
    <script>
    function redhash(text) {
    var re = /:([^ \f\n\r\t\v:]+)\s/mig;
    var str = text;
    document.write(str.replace(re,':<b>$1</b> '));
    }
    
    
    var r = " aaaaaaaa:bbbb!cbbb sdfsdfs     sdf   aaa#$aaa aWR$%a:bbbbbaaaaaaaa:ybbbbbb $aaa$aaaaa:ubbbb@%^bb aaaaaaaa:ibbbbbb Привет Мир!Я делаю скрипт....         aaaaaaa:ibbbbbb ";
    </script>
    Готовый текст<br>
    <script>
    redhash(r) ;
    </script>
    Скрипт ищет в тексте записи вида символы:символы:.........:символы:пароль и подсвечивает пароль. Пример сдесь http://maksrusya.narod.ru/java.html
    Если подходит можно адаптировать под твой скрипт. Но есть проблемка я не могу запустить исходный (твой) скрипт.
     
    #9 Red_Red1, 22 Aug 2007
    Last edited: 22 Aug 2007
  10. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    Если вдруг кто-то не понял автор темы просит изменить\написать userjs (Opera и Мозилла (работает при установке плагина) смотри operafan.net)
     
    #10 inv, 22 Aug 2007
    Last edited: 22 Aug 2007
  11. sqr

    sqr Elder - Старейшина

    Joined:
    15 Dec 2006
    Messages:
    30
    Likes Received:
    9
    Reputations:
    0
    наскоко я понял надо просто выделить текст другим цветом
    предлогаю формировать в контейнер
    нужный текст еще на сервере в пхп коде, но ничего с ним не делать а в случае нажатия шифт ентер просто устанавливать свойство цвета шрифта через css
    Тоесть вы не трогаете само содержание а просто задаете вид отображения
    И это не требует такого огромного количества жаваскрипт кода
    Чтото я не понимаю всей этой завязаной канители наверное я гений........
    или наоборот :)
     
  12. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    автору нужны bb теги
    [color=цвет]текст[/color]
    Я еще раз повторяю нужен скрипт не для страницы
    а для userjs (operafan.net)

    Вообщем все сказал=\Больше повторять не буду,пусть автор подредактирует 1сообщение в теме чтобы не было непоняток
     
  13. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    исправил первый пост, читайте внимательно. Если не можете справиться с Грисманки, пробуйте с оперой, там проще
     
  14. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Подскажите КАК запускать этот скрипт и/или как пользоваться. Перепробовал все варианты.... установил оперу нужной версии, выполнил настройки которые описаны в скрипте. Не получилось! Поставил файрфокс нужный, установил грисманки, вроде как добавил новый скрипт, тоже нифига не работает.
    Хочу разобраться чтобы добить задачку (с регулярками работал в ПХП, а вот тут не приходилось и решение как бы есть но...). Для пробы скачал с operafan.net один из userjs скриптов (первый самый - наклейки) подключил - заработало. Ну а ЭТОТ хоть ты тресни никак не могу заставить работать. Кто нибудь попробуйте у себя. Может я не так проверяю. Я создаю хтмл файлик с формой для ввода текста, пишу там что-то типа a9bceb0ac1654b9b0ec2fd8b23f859db:vasya , а дальше сколько не нажимаю Ctrl+Enter Shift+Enter пароль так и не засветился :(


    А что касается задания, так тут мне кажеться немного не правильно задаеться поиск пароля в регулярном выражении. Ведь какая нам разница какого вида хеши мы забили в форму, так же нам все равно напишем мы хеш:пароль или хеш:соль:пароль, нам не нужно делить эти строки (для одной одна регулярка для другой другая), тут ведь четко нужно засветить последнее после двоеточия. Так не все ли равно что было ДО этого двоеточия. Подобную регулярку (она намного проще) я описал в предыдущем посте.
     
    #14 Red_Red1, 23 Aug 2007
    Last edited: 23 Aug 2007
  15. Thanat0z

    Thanat0z Негрин

    Joined:
    6 Dec 2006
    Messages:
    627
    Likes Received:
    498
    Reputations:
    311
    1) чтоб скрипт работал, в самом начале надо указать область действия - урл ачата или локалхост
    2) не забыть в опере тот диалог с выбором папки где скрипты
    з) попробовать поставить курсор перед хешем, либо через несколько строк после хеша.
    4) пробуйте тока шифтентер.
    5) длина хеша важна, чтоб скрипт обычный текст не трогал
     
  16. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    создаем скрипт test.js текстом
    alert();для проверки работает ли вообще хоть
    какой-нибдуь скрипт,при ошибке в коде скрипт
    может вообще не работать в приницпе

    см консоль ошибок

    Дальше идем в настройки оперы
    tools-preferences-advances-content-javascriptoptions-user javascript files
    или изменяем\смотрим настройки для опредленного сайта

    @include
    @exlude
    для https разрешение)нужно
    необязательны в начале скрипта(для всех сайтов папка со скриптами одинаковая,
    то лучше использовать)

    для мозиллы качаете плагин,дальше сами)

    ***
    видео только по просьбе(лс)
     
    #16 inv, 23 Aug 2007
    Last edited: 23 Aug 2007
  17. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Ну и задачку ты подкинул, Танатоз, неделю возился, но зато узнал что такое пользовательские яваскрипты (userJS) и повторил регулярные выражения.
    Есть кое-какие результаты, но сначала анализ скрипта из условия.
    Я пытался подключить этот скрипт у себя - увы и ах скрипт не заработал. Вот тут для меня случился резкий налом, или я не умею подключать такие скрипты или в скрипте ошибка. После долгих раскопок и чтения я таки нашел ошибку в скрипте. Вот она:
    Code:
    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) Цитата Танатоз:
    Эта ошибка вызвана как раз из-за того что описано в первом случае выше.
    Решение:
    Code:
     /(^|\s)(\w{31,32}\:)([^\s\r]+\:)([^\s\r]+)/mig 
    – по крайней мере оно учитывает то что искомая строка должна НАЧИНАТЬСЯ либо сначала строки либо с пробелов, а дальше уже 32 символа и т.д.
    2) Заканчивать регулярку нужно вот так:
    ($|\s) т.е. или конец строки или пробел. Причем в самой длинной регулярке там где хеш:логин:пароль этот финал можно опустить. А вот в более коротких нельзя т.к. будет окрашено ненужное.
    Результат:
    Функция redhash этого скрипта должна выглядеть вот так:
    Code:
    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 символов, тогда:

    Code:
    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> нужно заменит на необходимые для расцветки.
    Если это еще актуально можно улучшить регулярки и полностью доделать задание. Тут например все таки не видно хеш мы нашли или просто какие-то символы заданного количества. Т.е. регулярка не ищет ХЕШ. Ну и конечно нужно тестировать выражения, в том плане что искомые строки могут находиться в разных кусках текста и после разных символов (перевод строки или знак пунктуации например). Опять же можно доделать если актуально остальную часть задания в плане поддержки различных видов записей.
    Все. Опять же простите за длину но хотелось поделится впечатлениями от решения задачки. Танатоз СПАСИБО! Супер не скучал неделю.
    З.Ы. Потестите кто-нибудь регулярки… может нужно что поменять.
     
    3 people like this.