Web-мастер: курс молодого бойца

полностью получить все вхождения

   

 Добавлено 2008-08-07 10:13:58
murich


Сообщений: 40
Зарегистрирован: 29.12.2007

Цитировать
Задача:
Получить массив со всеми вхождениями. А именно есть к примеру строка
 {я сегодня|он вчера} {купил|продал {вертолет|самокат}|убился {об стену|мокрым тапком}}
В результате нужно получить следующее (порядок элементов не обязательно такой):
Array
(
    [i] => {я сегодня|он вчера}
    [i] => {купил|продал {вертолет|самокат}|убился {об стену|мокрым тапком}}
    [i] => {вертолет|самокат}
    [i] => {об стену|мокрым тапком}
)
Делаю вот так:
preg_match_all('!{(.*?)}!si', $txt, $ff);
Получаю вот что:
Array
(
    [0] => {я сегодня|он вчера}
    [1] => {купил|продал {вертолет|самокат}
    [2] => {об стену|мокрым тапком}
)
Помогите плиз
Наверх  Посмотреть профиль    

 Добавлено 2008-08-07 13:59:23
evgenijj
Модератор




Сообщений: 1371
Зарегистрирован: 09.11.2007

Цитировать
Не, я пас. Мне так кажется, что с помощью регулярных выражений ее вообще не решить. Я бы написал регулярное выражение типа
'{[^}{]*}'
Т.е. искать текст между фигурными скобками, и между этими скобками других фигурных скобок быть не должно. Это регулярное выражение найдет
{я сегодня|он вчера}
{вертолет|самокат}
{об стену|мокрым тапком}
В исходной строке заменяем найденные вхождения на какой-нибуд уникальный код (чтобы потом произвести обратную замену):
[123] {купил|продал [456]|убился [789]}
Потом повторяем эту процедуру - опять ищем по шаблону
'{[^}{]*}'
Так мы найдем строку
{купил|продал [456]|убился [789]}
а заменив в ней наши вставки [xxx] обратно, получим
{купил|продал {вертолет|самокат}|убился {об стену|мокрым тапком}}
Если уровень вложенности неограниченный - то вообще надо бы написать рекурсивную функцию.


Денежные купюры пронумерованы для того, чтобы когда-нибудь я мог сложить их все одну к одной, по порядку.
Наверх  Посмотреть профиль   Сайт автора  

 Добавлено 2008-08-07 23:22:38
murich


Сообщений: 40
Зарегистрирован: 29.12.2007

Цитировать
Сделал так:
$txt ='{я сегодня|он вчера} {купил|продал {вертолет|самокат}|убился {об стену|мокрым тапком}}';
preg_match_all('!{[^}{]*}!', $txt, $ff); 
 
foreach ($ff[0] as $k=>$v){
    $txt = str_replace($v, '['.$k.']', $txt);
    }

preg_match_all('!{[^}{]*}!', $txt, $f); 

foreach ($ff[0] as $k=>$v){
    $f[0] = str_replace('['.$k.']', $v , $f[0]);
    }
$ff = array_merge ($ff[0], $f[0]);
На рекурсивную функцию ума не хватило, а очень хотелось бы.
Дело в том, что никогда не писал рекурсивных функций и так и не смог осмыслить механизм работы в данном случае
Помоги мне пожалуйста очередной раз.
Наверх  Посмотреть профиль    

 Добавлено 2008-09-11 19:54:44
murich


Сообщений: 40
Зарегистрирован: 29.12.2007

Цитировать
Эх
Наверх  Посмотреть профиль    

 Добавлено 2008-11-14 23:20:40
murich


Сообщений: 40
Зарегистрирован: 29.12.2007

Цитировать
ну вот я немного поумнел и вспомнил про эту рекурсивную функцию
function rr($t){
    preg_match_all('!{[^}{]*}!', $t, $f);
    $f = str_replace('}', '', str_replace('{', '', $f[0]));
    //  здесь делаем с наименьшими вхождениями то что нам нужно, подразумевается, что скобочек после них не остается. 
    if(!strstr($t, '{') and !strstr($t, '}')) return $t;
    else return rr($t); 
}
Наверх  Посмотреть профиль    
   
Быстрый ответ
 
Цвет шрифта: Закрыть все теги
Сообщение
Защитный код