Посоветуйте по регуляркам

Тема в разделе "PHP Pro", создана пользователем Arqin, 7 дек 2009.

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

    Arqin

    Регистр.:
    17 мар 2009
    Сообщения:
    185
    Симпатии:
    37
    Столкнулся с такой задачей. Необходимо заменять в строке определенный набор символов на элемент массива, ключем которого является этот набор символов.
    Для более точного понимания приведу пример:
    есть строка и массив:
    PHP:
    $string 'nkudfhsksd lfsdhfosdfklsdf fsdkfhsdkjfhsdk
    ###Home######Back### lfksdhgksdfhgdfk ###Home# fjsdgfsdjf 
    &*(^*^(&^(*& dnksdjhsdkjfnsdk dkgvfkvfn 
    fkdvdfkvnhdfvkldfjvldfvndf 
    ###Hello### dklfghdfoghdf 
    vejrgftweruifhnsd cdfugdfjkdfjkl'
    ;
    $arr = array ('Home' => 'Домой',
                  
    'Back' => 'Назад',
                  
    'Hello' => 'Привет');
    на выходе нам небходимо получить:
    PHP:
    $transl_str ='nkudfhsksd lfsdhfosdfklsdf 
    fsdkfhsdkjfhsdk ДомойНазад lfksdhgksdfhgdfk 
    ###Home# fjsdgfsdjf &*(^*^(&^(*& 
    dnksdjhsdkjfnsdk dkgvfkvfn fkdvdfkvnhdfvkldfjvldfvndf 
    Привет dklfghdfoghdf vejrgftweruifhnsd cdfugdfjkdfjkl'
    ;;
    вот.
    Заменить на какое-то конкретное слово не проблема. Просто беру паттерн
    PHP:
    $pattern '/###[a-zA-Z]+###/';
    И меняю preg_replace`ом. Вся загвоздка как подставить значение из массива.
    Не хотелось бы в цикле каждый раз по массиву гулять, как встретится слово. А знаний как это сделать одним preg_replace к сожалению не хватает. Может кто подскажет с какой стороны к этому подойти?
    P.S.: Думал использовать preg_replace_callback, но не разобрался как ее втюхнуть в класс...
     
  2. Sanuch

    Sanuch

    Регистр.:
    25 май 2009
    Сообщения:
    207
    Симпатии:
    70
    preg_replace может принемать и массивы на входе
    PHP:
    $arr = array ('Домой','Назад','Привет');
    $pattern = array ('/###Home###/','/###Back###/','/###Hello###/');  
    echo 
    preg_replace($pattern$arr$string);
     
    Arqin нравится это.
  3. Arqin

    Arqin

    Регистр.:
    17 мар 2009
    Сообщения:
    185
    Симпатии:
    37
    Хмм... спасибо! Очень интересный факт! Не знал =(
     
Статус темы:
Закрыта.