| czukowski |
30.07.2007 18:56 |
Тестирование регулярных выражений
Этот простой скрипт поможет вам составить и протестировать регулярные выражения для использования в Perl, PHP, Javascript, .NET итд.
Т.к. данная тема не относится конкретно к какому-то языку программирования, хотя и написана на Javascript-е, ложу ее в этот раздел.
Данный скрипт я писал в рамках своей дипломной, но впоследствие он оказался настолько для меня полезным, что я выдрал его оттуда и сохранил как отдельную HTML-страницу.
Сохраните этот код как файл HTML и откройте в любом браузере
PHP код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="ru" lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Тестирование RegExp</title> <style> input, textarea, option, select { font:12px Arial, Helvetica, sans-serif; letter-spacing:normal; } .regtest { line-height:1.5em; background-color:#e9e9e9; } .regtest em { background-color:#ff0; } .item_numer { font-size:28px; color:#aaa; } .fullwidth { width:100%; } .notpassed { font-weight:bold; } .error { color:#f00; } .txtcenter{text-align:center;} .col_details,.col_addanswer{background:#eaeaea;} .col_details2{background:#f3f3f3;padding:0px 3px;vertical-align:top;width:100%;} .col_details,.col_details2{font-size:12px;letter-spacing:.2pt} </style> </head> <body> <script type="text/javascript">//<![CDATA[ function clear_error(itm) { var re=new RegExp('(^| )error( |$)','gi'); itm.className = itm.className.replace(re,''); } function $() { var elements = new Array(); for (var i = 0; i < arguments.length; i++) { var element = arguments[i]; if (typeof element == 'string')element = document.getElementById(element); if (arguments.length == 1)return element; elements.push(element); } return elements; } function check_validate_input() { var sel=$('regexpsel'); var input=$('regexp'); clear_error(input); if(sel.selectedIndex==0){input.focus();} else{input.value=sel.value;$('regexp').value=sel.value;} } function check_validate_field(itm) { clear_error(itm); try { var regexp = new RegExp(itm.value); } catch(e) { var msg='Регулярное выражение содержит ошибку:\n%s'; msg=msg.split('%s'); window.alert(msg[0]+e); itm.className+=' error'; return false; } return true; } function check_validate_select() { var sel=$('regexpsel'); var itm=$('regexp'); var si=0; if(!check_validate_field(itm)){return false;} for(var i=1;i<sel.length;i++) { if(itm.value==sel.options[i].value){si=i;break;} } clear_error(itm); sel.selectedIndex=si; } function test_go() { var itm=$('regexp'); var input=$('regtest'); var multiline=$('multiline').checked; var cis=$('cis').checked; if(itm.value=='') { window.alert('Задайте регулярное выражение!'); return false; } if(!check_validate_field(itm)){return false;} if(input.value=='') { window.alert('Задайте тестируемые примеры! Примеры - это текстовые строки, которые тестируются на предмет выполнения вложенного регулярного выражения. Задайте один пример на каждую строчку или выберите "Многостроковый пример", тогда примером будет считаться весь заданный текст.'); return false; } if(multiline) { var subjects=Array(input.value); } else { var subjects=input.value.split("\n"); } var m=null,res=''; var regexp=new RegExp(itm.value,'g'+(cis?'i':'')); for(var i=0;i<subjects.length;i++) { m=subjects[i].match(regexp); if(m==null) { res+='<i class="error">не найдено</i><br />'; } else { for(var j=0;j<m.length;j++) { m[j]=m[j].replace(/"/g,'"'); m[j]=m[j].replace(/\</g,'<'); m[j]=m[j].replace(/\>/g,'>'); subjects[i]=subjects[i].replace(/"/g,'"'); subjects[i]=subjects[i].replace(/\</g,'<'); subjects[i]=subjects[i].replace(/\>/g,'>'); } for(var j=0;j<m.length;j++) { subjects[i]=subjects[i].replace(m[j],'<em>'+m[j]+'</em>'); } res+=subjects[i]+'<br />'; } } if(multiline) { res=res.replace(/\n/gi,'<br />'); } $('testresults').innerHTML=res; } //]]></script> <h1>Тестирование RegExp</h1> <table> <tr> <td class="col_details2" style="vertical-align:bottom">Регулярное выражение (выберите из меню или введите свое):</td> <td class="col_details2">Выберите: <select id="regexpsel" onchange="check_validate_input();"> <option value="">Свое</option> <option value="[0-9]+">Числа</option> <option value="$\w+^">Одно слово</option> <option value="^([a-z0-9&\-_.]+?@[\w\-]+\.([\w\-\.]+\.)?[\w]+)$">Адрес email</option> </select></td> </tr> <tr> <td class="col_details2" colspan="2"><input id="regexp" name="regexp" type="text" onchange="check_validate_select();" class="fullwidth" value="" /></td> </tr> <tr> <td class="col_details2" colspan="2">Тестовые примеры:<br /> <textarea id="regtest" name="regtest" class="fullwidth" cols="35" rows="4" style="white-space:pre;"></textarea> <input id="cis" name="cis" type="checkbox" value="1" /> <label for="cis">Регистронезависимый тест</label> <input id="multiline" name="multiline" type="checkbox" value="1" /> <label for="multiline">Многостроковый пример</label></td> </tr> <tr> <td class="col_details2 txtcenter" colspan="2"><input id="testgo" name="testgo" type="button" onclick="test_go();" value="Тестировать" /></td> </tr> <tr> <td class="col_details2" colspan="2"><b>Результаты</b>:<br /> <span id="testresults" class="regtest"><i>Пока нету</i><br /> Примеры - это текстовые строки, которые тестируются на предмет выполнения вложенного регулярного выражения. Задайте один пример на каждую строчку или выберите "Многостроковый пример", тогда примером будет считаться весь заданный текст..</span></td> </tr> <tr> <td class="col_details2 txtcenter" colspan="2"><input id="close" name="close" type="button" onclick="window.close();" value="Закрыть окно" /></td> </tr> </table> </body> </html>
Надо только помнить о том, что регулярные выражения в Javascript отличаются от PREG в том смысле, что не поддерживают некоторых вещей, а именно: - Локальная установка внутренних переключателей - можно устанавливать только глобально, для всего шаблона.
- Обратные утверждения: не поддерживаются выражения типа (?<=pattern) и (?<!pattern), однако поддерживаются утверждения "вперед" типа (?=pattern) и (?!pattern)
- Не поддерживаются одноразовые подвыражения (?>pattern)
- Не поддерживаются условные подвыражения (?(condition)yes-pattern) и (?(condition)yes-pattern|no-pattern)
- Не поддерживаются комментарии (?#comment)
- Не поддерживаются рекурсивные подвыражения (?R)
То есть, регулярные выражения, содержащие выше указанные элементы тестировать этим скриптом нельзя, по крайней мере, до того времени, пока их поддержка не будет добавлена в Javascript.
з.ы.: наличие багов не исключаю :)
|