Маленький скрипт который поможет мутить регулярные выражения

Тема в разделе "Регулярные выражения", создана пользователем bumer3, 1 янв 2009.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    Часто приходиться делать регулярные выражения именно большие, поэтому решил написать небольшой скриптик, может он работает не сильно отлично но надеюсь комуто сможет помочь

    PHP:
    <?php
    function bumer3_regexp($source$mode='visual'/*server*/)
    {
        
    $end '';
        
    $nums strlen($source);
        
    $arr str_split($source);
        
    //print_r ($arr);
        
    $curs 0;
        if(
    $mode=='server')
        {
            
    $phpsymbols '"\\/?*+.#$()?@,^!'."'";
        }
        else
        {
            
    $phpsymbols '"\\/?*+.#$()?@,^!';
        }
        
    //print ($phpsymbols);
        
    $commandslist '-anyt-numb-nonm-spac-text-word-nowo-tabb-fend-lend-';
        
    //echo $phpsymbols;
        //die();
        
    while($curs<$nums)
        {
            if(
    $arr[$curs]=='[' or $arr[$curs]=='{')
            {
                
    $comand $arr[($curs+1)].$arr[($curs+2)].$arr[($curs+3)].$arr[($curs+4)];
                
    //print $comand;
                
    if(strpos($commandslist$comand) == '')
                {
                    
    $end .= '\\'.$arr[$curs];
                    
    $curs $curs 1;
                    
    //exit;
                
    }
                else
                {
                    
                    if(
    $arr[$curs]=='[')
                    {
                        
    $dels '[';
                        
    $dele ']';
                        
                    }
                    else
                    {
                        
    $dels '{';
                        
    $dele '}';
                        
                    }
                    
                    if(
    $arr[$curs+5]=='-')
                    {
                        
    $regnum '';
                        
    $fromstart 6;
                        
    $symbtmp $arr[$curs+$fromstart];
                        while(
    $symbtmp <> $dele and $fromstart<10)
                        {
                            
    $regnum .= $symbtmp;
                            
    $fromstart $fromstart 1;
                            
    $symbtmp $arr[$curs+$fromstart];
                            
    //echo ($fromstart);
                        
    }
                        
    $regnum $regnum 0;
                        
    $regnum '{'.$regnum.'}';
                        
    $lastregsymnum $fromstart 1;
                    }
                    else
                    {
                        
    $symnum false;
                        
    $lastregsymnum 6;
                        
    $regnum '*';
                    }
                    
    $reg '';
                    if(
    $dels == '[' and $comand <> 'anyt')
                    {
                        
    $regstart '[';
                        
    $regend ']'.$regnum;
                    }
                    elseif(
    $dels == '{' and $comand <> 'anyt')
                    {
                        
    $regstart '([';
                        
    $regend ']'.$regnum.')';
                    }
                    elseif(
    $dels == '{' and $comand == 'anyt')
                    {
                        
    $regstart '(';
                        
    $regend ')';
                    }
                    elseif(
    $dels == '[' and $comand == 'anyt')
                    {
                        
    $regstart '';
                        
    $regend '';
                    }
                    
    //die($command);
                    
    if($comand=='anyt')
                    {
                        
    $regcenter '.'.$regnum.'?';
                    }
                    elseif(
    $comand=='numb')
                    {
                        
    $regcenter '\\d';
                    }
                    elseif(
    $comand=='nonm')
                    {
                        
    $regcenter '\\D';
                    }
                    elseif(
    $comand=='spac')
                    {
                        
    $regcenter '\\s';
                    }
                    elseif(
    $comand=='text')
                    {
                        
    $regcenter '\\S';
                    }
                    elseif(
    $comand=='word')
                    {
                        
    $regcenter '\\w';
                    }
                    elseif(
    $comand=='nowo')
                    {
                        
    $regcenter '\\W';
                    }
                    elseif(
    $comand=='tabb')
                    {
                        
    $regcenter '\\t';
                    }
                    elseif(
    $comand=='fend')
                    {
                        
    $regcenter '\\f';
                    }
                    elseif(
    $comand=='lend')
                    {
                        
    $regcenter '\\n';
                    }
                    
    $reg $regstart.$regcenter.$regend;
                    
                    
    $curs $curs $lastregsymnum;
                    
    $end .= $reg;
                }
                
                
    //print 'la-la-la';
                //$curs = $curs + 4;
            
    }
            elseif(
    strpos($phpsymbols$arr[$curs]) <> '')
            {
                
    //если спец символ то записываем его в строку и слеш перед ним и идем дальше
                
    $end .= '\\'.$arr[$curs];
                
    $curs $curs 1;
            }
            elseif(
    $mode == 'visual' and $arr[$curs] == "'")
            {
                
    //print (dd);
                
    $end .= '\\\\\\'.$arr[$curs];
                
    //print ($end);
                
    $curs $curs 1;
            }
            else
            {
                
    //если обычный символ то записываем его в строку и идем дальше
                
    $end .= $arr[$curs];
                
    $curs $curs 1;
            }
        }
        if(
    $mode=='server')
        {
            
    $end='#'.$end.'#i';
        }
        else
        {
            
    $end="'".'#'.$end.'#i'."'";
        }
        
    //$end='#'.$end.'#i';
        
    return $end;
    }
    ?>
    А теперь как пользоваться
    PHP:
    $text = <<<REGEXP
    текст для обработки
    REGEXP;
    print 
    bumer3_regexp($text'visual');
    там где текст для обработки можно вставить любой код и следующие обозначения
    {...} - выбрать какойто элемент
    [...] - просто присутствует

    поддерживаеться конструкции
    anyt любой текст
    numb цифра
    nonm все кроме цифры
    spac пробел
    text текст без пробела
    word символ образующий слово
    nowo символ не образующий слово
    tabb симаол табуляции
    fend конец файла
    lend переход на другую строку

    [anyt] - любое количество символов текста
    [anyt-6] - 6 символов текста и.т.д.

    Может комуто пригодиться, а может ктото усовршенствует так как на этом возможности регулярных выражений не заканчиваються
     
    Stripe, a_smith, zerdek и ещё 1-му нравится это.
  2. Nike59

    Nike59

    Регистр.:
    13 ноя 2006
    Сообщения:
    459
    Симпатии:
    100
    Скрипт интересный. Только из описания непонятно, как им пользоваться. Хорошо было бы привести, пару примеров текста для парсинга с вставками {...} и [...] Ну и с сответствующими модами в обращении к функции. Работает ли он с карманами (some code)?
     
  3. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    Пример:
    Парсим со страниц нулледа:
    HTML:
    <td class="alt2" nowrap="nowrap">
    	<div class="smallfont">
    		<strong>Добро пожаловать, <a href="member.php?u=49158">bumer3</a>.</strong><br />
    		Ваш последний визит: 31.12.2008 в <span class="time">22:32</span>
    
    		
    			<div><a href="private.php">Личные сообщения</a>: Новых 0, всего 11.</div>
    		
    
    		
    	</div>
    Вовод скрипту:
    Код:
    <td class="alt2" nowrap="[text]">[spac]<div class="smallfont">[spac]<strong>Добро пожаловать, <a href="member.php?u={numb}">{anyt}</a>.</strong><br />[spac]Ваш последний визит: [text] в <span class="time">[text]</span>[spac]<div><a href="private.php">Личные сообщения</a>:[anyt]</div>[spac]</div>
    Получаем из скрипта:
    Код:
    '#<td class="alt2" nowrap="[\S]*">[\s]*<div class="smallfont">[\s]*<strong>Добро пожаловать\, <a href="member\.php\?u=([\d]*)">(.*?)<\/a>\.<\/strong><br \/>[\s]*Ваш последний визит: [\S]* в <span class="time">[\S]*<\/span>[\s]*<div><a href="private\.php">Личные сообщения<\/a>:.*?<\/div>[\s]*<\/div>#i'
     
    a_smith нравится это.
  4. Nike59

    Nike59

    Регистр.:
    13 ноя 2006
    Сообщения:
    459
    Симпатии:
    100
    В принципе, это лишь мнемоника для регулярных конструкций. Все равно, нужно знать регулярные выражения. Хотя для совсем начинающих скрипт может облегчить вход в мир регулярных выражений. Из удобств отмечу автоматическую расстановку экранирования спецсимволов. Сам скрипт не тестировал, однако, навскидку должен работать как надо. Не нашел только конструкцию выбора (шило|мыло).
     
  5. bumer3

    bumer3

    Регистр.:
    10 янв 2008
    Сообщения:
    291
    Симпатии:
    154
    Когда делал не учитывал. Просто часто нужно делать граберы с дургих сайтов и растановка всех спецсимволов отнимала очень много времени, лично мне скрипт помагает.
     
  6. eXistanze

    eXistanze Создатель

    Регистр.:
    2 сен 2006
    Сообщения:
    28
    Симпатии:
    3
    Есть бесплатная программка Regex Coach. C ее помощью очень удобно составлять регулярные выражения. В ней два окна: регулярное выражение и текст для его тестирования.

    [​IMG]
     
    a_smith и exe7 нравится это.
  7. funman

    funman

    Регистр.:
    28 дек 2007
    Сообщения:
    157
    Симпатии:
    25
    RegexBuddy 3 - мне эта тулза больше нравиться.
     
  8. FallenCrow

    FallenCrow Постоялец

    Регистр.:
    28 апр 2008
    Сообщения:
    66
    Симпатии:
    5
    Когда то писал маленькую прогу для этих целей, могу скинуть если кому интересно, только она дескоптная.
     
  9. Metaller

    Metaller Прохожие

    Тестирование регулярных выражений - плагин для Firefox

    Regular Expressions Tester addons.mozilla.org/ru/firefox/addon/2077
     
  10. Miron86

    Miron86 Создатель

    Регистр.:
    23 янв 2009
    Сообщения:
    20
    Симпатии:
    2
    Очень интересно, заливайте :)
     
Статус темы:
Закрыта.