preg_replace_callback

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

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

    jami Постоялец

    Регистр.:
    10 авг 2011
    Сообщения:
    114
    Симпатии:
    39
    PHP, есть задача:
    заменить в документе все строки вида {a1|b2|c3|etc} на один из элементов разделенных "|" в скобках, хотелось бы сделать одним регекспом.
    т.е. {a1|b2|c3|etc} -> убрать {} -> split '\|' -> rand
    PHP:
    $msg file("msg.txt");
    function 
    rand_msg($msg) {
        
    $res_msg "";
        foreach (
    $msg as $st) { 
            
    preg_replace_callback("|(\{[^\}]+\})|"'rand_elem'$st);
            
    $res_msg $res_msg $st;
            
    //$sites=$sites[rand(0, count($sites) - 1)];
        
    }
        return 
    $res_msg;
    }
    function 
    rand_elem($m) {
        
    preg_replace("|\{|"' '$m[1]);
        
    preg_replace("|\}|"' '$m[1]);
        
    $sp split('\|'$m[1]);
        
        
    $res $sp[rand(0count($sp)-1)];
        echo 
    $res;
        return 
    $res;
    }
    в этом коде rand_msg от $msg возвращает исходное $msg, без нужных подстановок.. хотя вроде все действия внешне похожи на правду.
    Подскажите плз, что не так, буду весьма благодарен.
     
  2. xymmep

    xymmep Постоялец

    Регистр.:
    7 дек 2007
    Сообщения:
    63
    Симпатии:
    22
    Код:
    [B][COLOR="Blue"]$st = [/COLOR][/B]preg_replace_callback("|(\{[^\}]+\})|", 'rand_elem', $st);
    У тебя рега обрабатывалась, но результат уходил в пустоту.
     
    jami нравится это.
  3. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    и preg_replace тоже в пустоте теряется, там можно и str_replace использовать
    PHP:
    $msg file("msg.txt");
    echo 
    rand_msg($msg);

    function 
    rand_msg($msg) {
        
    $res_msg "";
        foreach (
    $msg as $st) {
            
    $st preg_replace_callback("/({[^}]+})/i"'rand_elem'$st);
            
    $res_msg $res_msg $st;
        }
        return 
    $res_msg;
    }
    function 
    rand_elem($m) {
        
    $m[1] = str_replace('{'''$m[1]);
        
    $m[1] = str_replace('}'''$m[1]);
        
    $sp explode('|'$m[1]);
        
    $res $sp[rand(0count($sp)-1)];
        return 
    $res;

     
Статус темы:
Закрыта.