БлогNot. PHP: проверка регулярных выражений онлайн

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>&nbsp;</td><td>&nbsp;</td>
   </tr>
   <tr>
    <td>( )</td><td>Подшаблон</td>
    <td>(a|b)</td><td>Выбор a или b в подшаблоне</td>
    <td>&nbsp;</td><td>&nbsp;</td>
    <td>&nbsp;</td><td>&nbsp;</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>&nbsp;</td><td>&nbsp;</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>&nbsp;</td><td>&nbsp;</td>
    <td>&nbsp;</td><td>&nbsp;</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>&nbsp;</td><td>&nbsp;</td>
     <td>&nbsp;</td><td>&nbsp;</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 [5658 просмотров]


теги: textprocessing php тест сервис jquery

К этой статье пока нет комментариев, Ваш будет первым