Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: почему так делает PCRE
 
 автор: duhon   (23.11.2011 в 12:58)   письмо автору
 
 

<?php
preg_match_all
('/a*|b*/''aaabbbccc'$r);
print_r($r);
//ожидаеться
/* Array
(
    [0] => Array
        (
            [0] => aaa
            [1] => 
            [2] => 
            [3] => 
            [4] => 
            [5] => 
            [6] => 
            [7] => 
        )

)*/
//реально возвращает
/* Array
(
    [0] => Array
        (
            [0] => aaa
            [1] => 
            [2] => bbb
            [3] => 
            [4] => 
            [5] => 
            [6] => 
        )

)*/
?>

То есть если не обращать внимание на пустые ячейки, то найти должно было только ааа так как квантификатор * позволяет пройти пустым, и второе условие никогда не должно было выполниться.

PCRE_VERSION 8.12 2011-01-15
PHP 5.3.5-1ubuntu7.3 with Suhosin-Patch (cli) (built: Oct 13 2011 21:56:07)

  Ответить  
 
 автор: duhon   (23.11.2011 в 13:22)   письмо автору
 
   для: duhon   (23.11.2011 в 12:58)
 

только что родилось очень бредовое мысль.

что если механизм получая совпадение с пустотой позицией запоминает место и отработанный шаблон, после сдвиг не происходит, так как курсор остался на том же месте, и опять пытается выполниться тот же шаблон в том же месте, и регулярка что бы не зациклиться делает искусственный переход к следующему символу, НО предусмотрительно проверив альтернативы, в данном случае это b*

хотя эту теорию я даже не знаю как проверить

  Ответить  
 
 автор: cheops   (23.11.2011 в 13:35)   письмо автору
 
   для: duhon   (23.11.2011 в 12:58)
 

Как раз на пустые ячейки и нужно обращать внимание - в них ответ, сколько удачных попыток было применить регулярное выражение, вот эти попытки
(aaa)bbbccc - [0]
aaa()bbbccc - [1]
aaa(bbb)ccc - [2]
aaabbb()ccc - [3]
aaabbbc()cc - [4]
aaabbbcc()c - [5]
aaabbbccc() - [6]

  Ответить  
 
 автор: duhon   (23.11.2011 в 14:58)   письмо автору
 
   для: cheops   (23.11.2011 в 13:35)
 

это я знаю :)

и ожидаю такое

(aaa)bbbccc - [0]
aaa()bbbccc - [1]
aaab()bbccc - [2]
aaabb()bccc - [3]
aaabbb()ccc - [4]
aaabbbc()cc - [5]
aaabbbcc()c - [6]
aaabbbccc() - [7]

так как начиная с позиции [1] первый слева шаблон a* всегда возвращает true, и в теории никакая сила не должна была заставить выполнить шаблон b*

  Ответить  
 
 автор: cheops   (23.11.2011 в 15:17)   письмо автору
 
   для: duhon   (23.11.2011 в 14:58)
 

У них два режима: они либо жадные, либо не жадные... По умолчанию жадные, т.е. если они видят b, а за ним еще bb - не могут с собой ничего поделать, тут же захватывают столько, сколько есть. А вот если инвертировать жадность, то картина будет другая - они будут по одному символу вперед продвигаться
(
    [0] => Array
        (
            [0] => 
            [1] => a
            [2] => 
            [3] => a
            [4] => 
            [5] => a
            [6] => 
            [7] => b
            [8] => 
            [9] => b
            [10] => 
            [11] => b
            [12] => 
            [13] => 
            [14] => 
            [15] => 
        )
)

  Ответить  
 
 автор: duhon   (23.11.2011 в 19:15)   письмо автору
 
   для: cheops   (23.11.2011 в 15:17)
 

спасибо за разьяснение

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования