PHP: проверка регулярных выражений онлайн
В блоге уже есть сервисы для некоторых полезных регулярных выражений, например, вот здесь для вещественных чисел, но это частный случай. А почему бы не сделать скрипт, где пользователь сам может "потренироваться" в составлении Regexp, сразу при этом видя, что получается?
Именно такой маленький сервис я сейчас и опубликую. Он позволяет задать основную часть регулярного выражения и модификаторы, а затем проверить любое количество строк на соответствие указанному шаблону. Результаты выводятся справа от многострочного поля ввода тестовых строк. Найденное соответствие подсвечивается, только первое, поскольку функция preg_match работает именно так.
Следует обратить внимание, что все символы во вводе значимы, в том числе, пробелы. Лишние пустые строки между тестовыми строками не возымеют действия, так что добавлять их незачем.
Скрипт работает в Юникоде и снабжён справкой прямо на своей странице.
Ниже дана ссылка на работающий сервис и исходники.
Возможно, код будет улучшаться и исходники перестанут соответствовать текущей онлайн-версии. В прикреплённом архиве, кроме показанных файлов index.php
(главная страница) и action.php
(обработчик регулярных выражений) присутствуют файлы
.htaccess
для настройки доступа, regexp.css
для несложного стилевого оформления и какая-то версия jquery.js
(ну, удобнее через JQuery в таких случаях, чем на чистом Javascript :)
Сервис для проверки регулярных выражений онлайн
Файл index.php
<!DOCTYPE html> <html dir="ltr" lang="ru-RU"> <head> <meta charset="utf-8"> <title>Сервис для онлайн-проверки регулярных выражений</title> <link rel="stylesheet" href="regexp.css"> <script type="text/javascript" src="jquery.js"></script> </head> <body> <div id="content"> <script type="text/javascript"> var state = 0; var previousRegexp = ''; var previousModifier = ''; var previousStrings = ''; function updateMe() { form = $('#mainform'); params = form.serialize(); action = mainform.action; $.post(action, params, function(data) { $('#result').html(data); }); } function checkMe() { if (strings.value !== previousStrings || regexp.value !== previousRegexp || modificator.value !== previousModifier) { state = 1; previousStrings = strings.value; previousRegexp = regexp.value; previousModifier = modificator.value; } if (state == 1) state = 2; else if (state == 2) { state = 0; updateMe(); } } $ (function () { document.getElementById('regexp').value = ''; checkMe(); setInterval('checkMe()', 350); }); </script> <noscript>Извините, для работы приложения нужен включённый Javascript</noscript> <form id="mainform" action="action.php" method="post" target="result"> <p>Регулярка <span>"/</span> <input id="regexp" name="regexp" size="80" value="" /> <span>/</span> <input id="modificator" name="modificator" size="6" maxlength="5" value="u" /> " с модификаторами </p> <table> <tr> <td valign="top"> <p>Выражения (по одному в строке)</p> </td> <td valign="top"> <p>Результаты для preg_match, совпадения <span class="matched">подсвечены</span></p> </td> </tr> <tr> <td valign="top"> <textarea id="strings" name="strings" cols="55" rows="10" maxlength="10000"></textarea> </td> <td valign="top"> <div id="result"></div> </td> </tr> </table> </form> <div id="help"> <table> <tr> <td colspan="8" align="center">Символьные классы и специальные символы</td> </tr> <tr> <td>[abc]</td><td>Любой из a, b, c</td> <td>[^abc]</td><td>Любой, кроме a, b, c</td> <td>[a-z]</td><td>Любой из диапазона</td> <td>[a-zА-Я]</td><td>Любой из диапазонов</td> </tr> <tr> <td>.</td><td>Любой символ</td> <td>\.</td><td>Символ точки</td> <td>\\</td><td>Символ "обратный слэш"</td> <td> </td><td> </td> </tr> <tr> <td>( )</td><td>Подшаблон</td> <td>(a|b)</td><td>Выбор a или b в подшаблоне</td> <td> </td><td> </td> <td> </td><td> </td> </tr> <tr> <td>^</td><td>Начало строки</td> <td>$</td><td>Конец строки</td> <td>\A</td><td>Начало текста</td> <td>\z</td><td>Конец текста</td> </tr> <tr> <td>\s</td><td>Пробельный символ</td> <td>\S</td><td>Не пробельный символ</td> <td>\n</td><td>Новая строка Unix</td> <td>\r\n</td><td>Новая строка Windows</td> </tr> <tr> <td>\b</td><td>Граница слова (начало/конец)</td> <td>\t</td><td>Табуляция</td> <td>\d</td><td>Цифра 0-9</td> <td>\D</td><td>Не цифра</td> </tr> <tr> <td>\w</td><td>Буква (включая цифры и подчёркивание)</td> <td>\W</td><td>Не буква (специальный символ)</td> <td>\pL</td><td>Буква в utf-8, с модификатором u</td> <td> </td><td> </td> <tr> <td colspan="8" align="center">Квантификаторы</td> </tr> <td>x?</td><td>Один x или пусто</td> <td>x*</td><td>Ноль и более x</td> <td>x+</td><td>Один и более x</td> <td>x{3}</td><td>x ровно 3 раза</td> </tr> <tr> <td>x{3,}</td><td>x 3 и более раз</td> <td>x{3,5}</td><td>x от 3 до 5 раз</td> <td> </td><td> </td> <td> </td><td> </td> </tr> <tr> <tr> <td colspan="8" align="center">Модификаторы</td> </tr> <tr> <td>i</td><td>Поиск не зависит от регистра. "/x/i" ищет и x, и X.</td> <td>U</td><td>Не жадный (ищущий минимальное соответствие) поиск </td> <td>u</td><td>Искать в Юникоде (utf-8)</td> <td>m</td><td>Искать в многострочном тексте</td> </tr> <tr> <td>s</td><td>Точка соответствует также переводу строки</td> <td>x</td><td>Игнорировать пробелы (в этом случае они экранируются обратным слэшем \)</td> <td> </td><td> </td> <td> </td><td> </td> </tr> </table> </div> </div> </body> </html>
Файл action.php
<?php $params = array ('regexp','modificator','strings'); foreach ($params as $num=>$var) { if (isset($_POST[$var])) $$var = htmlspecialchars($_POST[$var],ENT_QUOTES,'utf-8'); else $$var = ''; } $array = preg_split ("/[\r\n]/",$strings); foreach ($array as $value) { if (!empty($value)) { $res = @preg_match ('/'.$regexp.'/'.$modificator, $value, $matches); if ($res===false) { echo 'Ошибка в регулярном выражении!'; exit; } else if ($res===0) echo $value.'<br>'; else if (!empty($matches[0])) { $pos = mb_strpos ($value, $matches[0],0,'utf-8'); if ($pos !== false) { $len = mb_strlen($matches[0],'utf-8'); echo ($pos>0 ? mb_substr ($value, 0, $pos,'utf-8') : ''). ($len>0 ? '<span class="matched">'.$matches[0].'</span>' : ''). mb_substr($value,$pos+$len,NULL,'utf-8').'<br>'; } else echo $value.'<br />'; } } } ?>
Скачать архив .zip с файлами скрипта (36 Кб)
P.S'ы. Так как в опубликованной версии текст интерпретируется построчно, использование модификатора "m" смысла не имеет.
Так как скрипт переведён в кодировку Юникода utf-8, модификатор "u" ставится по умолчанию.
Скриншот с работающего сервиса
Примеры регулярных выражений, на которых проверялся сервис (без модификаторов, только содержимое поля "Регулярка"):
[\+\-]?\d+ целое положительное число, возможно, со знаком в начале ^\w+$ пароль (вся строка может включать только латинские буквы, цифры и знак подчёркивания) "[\pL\s]+" часть строки в кавычках вместе с ними (в том числе, с русскими буквами; поставить модификатор u) \b(\d{2})\.(\d{2})\.(\d{2}|\d{4})\b дата в простом формате ДД.ММ.ГГ или ДД.ММ.ГГГГ \{([^\}]*)\} текст в фигурных скобках вместе со скобками \(([^\)]*)\) текст в круглых скобках вместе со скобками \d{1,2}\.\.\. одна или две цифры, потом три точки
19.10.2016, 09:21 [5792 просмотра]