preg_replace_callback поиск совпадений

Тема в разделе "PHP", создана пользователем kud, 3 май 2014.

Модераторы: latteo
  1. kud

    kud Постоялец

    Регистр.:
    18 фев 2009
    Сообщения:
    89
    Симпатии:
    11
    Код:
    <?php
    $text = 'Съешь ещё этих мягких французских булок';
    $patterns[] = "{(\w+\s\w+\s\w+\b)}Usmi";
    preg_replace_callback($patterns,"func",$text);
    
    function func($matches) {
        echo "<pre>";
        print_r($matches);
        echo "</pre>";
    }
    ?>
    Как мне в $matches получить все совпадения по три слова в тексте?
    Что-бы было
    1) Съешь ещё этих
    2) ещё этих мягких
    3) этих мягких французских
    4) мягких французских булок
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Хм, откуда такое задание, из книги или инста? если сам придумал- чисто через регулярким нельзя такое сделать, они не поддерживают такие паттерны. Либо через геморой - главный принцип- поиск всех слов и группировка их по три
    PHP:
    $text 'Съешь ещё этих мягких французских булок';
    $patterns[] = "~\S+(\s|$)~";
    preg_replace_callback($patterns,"func",$text);

    $ayyay_3_word = array();

    function 
    func($matches) {
        global 
    $ayyay_3_word;
        
    $ayyay_3_word[] = $matches[0];
        if(
    sizeof($ayyay_3_word)<3){
           return;
        }
        echo 
    'kot govorit: '.  implode(''$ayyay_3_word).'<br/>';
        
    array_shift($ayyay_3_word) ;
    }
     
  3. kud

    kud Постоялец

    Регистр.:
    18 фев 2009
    Сообщения:
    89
    Симпатии:
    11
    Че-то мне казалось что регулярками можно все сделать :)
    Вообще, немного ближе была вот такая регулярка:
    Код:
    <?php
    $patterns[] = "{(\w+\s+(?=(\w+\s)(?=(\w+\b))))}si";
    ?>
    Она находит все совпадения и там можно по крайней мере получить данные по трем словам в func. Но заменяет только первое слово ($matches[1]), вместо трех.
     
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Можно, но в пхп их функционал урезан. К примеру нет поддержки вложенных шаблонов.

    Хм, а вот твой паттерн - не возьму в толк как он работает. Вроде регулярка должна начинать поиск с того места, где закончил поиск предыдущий шаблон. Или (?= он не считает?
     
  5. kud

    kud Постоялец

    Регистр.:
    18 фев 2009
    Сообщения:
    89
    Симпатии:
    11
    (?=выражение) означает - "может совпасть справа". Но курсор остается на месте.
    Это опережающая проверка.
    Есть еще негативная опережающая проверка - (?!выражение) - означает, "не может совпасть справа"
    И ретроспективные проверки:
    Негативная (<?=выражение) - "может совпасть слева"
    Позитивная (?<!выражение)) - "не может совпасть с лева"
     
  6. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    я знаю эти паттерны, просто думал если совпало, то курсор сдвигается, а не остаётся на месте. Оказывается вот оно что. Но всё равно, мне кажется так регулярку использовать - бред) Только в научных познаниях