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

Статус
В этой теме нельзя размещать новые ответы.

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) мягких французских булок
 
Хм, откуда такое задание, из книги или инста? если сам придумал- чисто через регулярким нельзя такое сделать, они не поддерживают такие паттерны. Либо через геморой - главный принцип- поиск всех слов и группировка их по три
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) ;
}
 
Че-то мне казалось что регулярками можно все сделать :)
Вообще, немного ближе была вот такая регулярка:
Код:
<?php
$patterns[] = "{(\w+\s+(?=(\w+\s)(?=(\w+\b))))}si";
?>
Она находит все совпадения и там можно по крайней мере получить данные по трем словам в func. Но заменяет только первое слово ($matches[1]), вместо трех.
 
Че-то мне казалось что регулярками можно все сделать :)
Можно, но в пхп их функционал урезан. К примеру нет поддержки вложенных шаблонов.

Хм, а вот твой паттерн - не возьму в толк как он работает. Вроде регулярка должна начинать поиск с того места, где закончил поиск предыдущий шаблон. Или (?= он не считает?
 
(?=выражение) означает - "может совпасть справа". Но курсор остается на месте.
Это опережающая проверка.
Есть еще негативная опережающая проверка - (?!выражение) - означает, "не может совпасть справа"
И ретроспективные проверки:
Негативная (<?=выражение) - "может совпасть слева"
Позитивная (?<!выражение)) - "не может совпасть с лева"
 
я знаю эти паттерны, просто думал если совпало, то курсор сдвигается, а не остаётся на месте. Оказывается вот оно что. Но всё равно, мне кажется так регулярку использовать - бред) Только в научных познаниях
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху