проблемы с preg_replace

Тема в разделе "Как сделать...", создана пользователем The_Wolf, 14 мар 2014.

  1. The_Wolf

    The_Wolf

    Регистр.:
    21 окт 2013
    Сообщения:
    339
    Симпатии:
    189
    есть код
    PHP:
      function replaceBBCode($text) {
        
    $str_search = array(
          
    "#\[code\](.+?)\[\/code\]#is"
        
    );
        
    $str_replace = array(
          
    $code["\\1"]
        );
        return 
    preg_replace($str_search$str_replace$text);
      }
    Нужно так сделать : чтобы [сode]1[/сode] заменил на $code["1"] .
    через \\1 не работает .
    точнее переменное не работает (\\1).
    ВАЖНО : чтобы заменял [сode]1[/сode] на значения переменной $code["1"]
     
    Последнее редактирование: 14 мар 2014
  2. Alekc

    Alekc Постоялец

    Регистр.:
    9 мар 2014
    Сообщения:
    50
    Симпатии:
    26
    Не получается вставить код нормально. Смотри здесь: http://ideone.com/HmaRfY

    PHP:
    preg_replace('%\[code\](.*?)\[/code\]%i''$code[\'$1\']'$text);
     
    Последнее редактирование модератором: 14 мар 2014
  3. The_Wolf

    The_Wolf

    Регистр.:
    21 окт 2013
    Сообщения:
    339
    Симпатии:
    189
    Как сделать чтобы работало ??
    таблица html содержит : ID и CODE
    PHP:
    <?php
        
    include('../admin/inc/config.php');
        
    mysql_select_db("phpsite",$connect);
        
    $result mysql_query("SELECT * FROM html");
        
    $html mysql_fetch_array($result);
            do {
                
    $html[$html['id']] = $html['code'];
            }
            while (
    $html mysql_fetch_array($result));
      function 
    replaceBBCode($text_post) {
        
    $str_search "#\[html\](.+?)\[\/html\]#is";
        
    $str_replace $html["\\1"];
        return 
    preg_replace($str_search$str_replace$text_post);
      }
    echo 
    replaceBBCode("[html]2[/html]");
    ?>
    Скрины таблицы : http://imgdisk.ru/images/4f2OF.png и http://imgdisk.ru/images/N9X8p.png
     
    Последнее редактирование: 14 мар 2014
  4. Alekc

    Alekc Постоялец

    Регистр.:
    9 мар 2014
    Сообщения:
    50
    Симпатии:
    26
    т.е. вы хотите чтобы [ b] hi[ /b ] стало <b>hi</b>?

    Код:
    // your code goes here
    $text = "asdasd [b]xxx[/b] asdasd";
    $result = preg_replace('%\[b\](.*?)\[/b\]%i', '<b>$1</b>', $text);
    echo $result;
    http://ideone.com/HmaRfY

    Input:
    Код:
    "asdasd [b]xxx[/b] asdasd"
    Output
    Код:
    asdasd <b>xxx</b> asdasd
     
  5. jDony

    jDony Создатель

    Регистр.:
    25 янв 2014
    Сообщения:
    41
    Симпатии:
    40
    Вообще лучше не изобретать подобных велосипедов. В них ОЧЕНЬ легко накосячить и получить целый вагон XSS уязвимостей. Популярные форумные движки годами подобные баги вылавливали.

    Лучше поищите готовое провернное решение, но я бы лучше отказался от подобных манипуляций, и использовал бы Markdown разметку и парсер.
     
  6. The_Wolf

    The_Wolf

    Регистр.:
    21 окт 2013
    Сообщения:
    339
    Симпатии:
    189
    Есть тег (бб-код) [HTМL] . Внутри его будет ID . ([HTМL]1[/HTМL]) .
    Как сделать так чтобы с бд взял ID 1 и столбец code и заменял [HTМL]1[/HTМL] на значения столбца code с id'ом 1 ??
    p.s : я не пишу форумный движок
     
  7. Alekc

    Alekc Постоялец

    Регистр.:
    9 мар 2014
    Сообщения:
    50
    Симпатии:
    26
    Вот, теперь немного понятнее, хотя логика немного странная по крайней мере.

    Сначала надо вытащить ид который находится в теге
    PHP:
    if (!preg_matchl('%\[html\](\d+)\[/html\]%i'$subject$regs)) {
       return;
    }
    $id $regs[1];
    После чего есть два варианта: если массив маленький то можно загрузить все в один array используя ид как ключ, и напрямую просить данные
    PHP:
    $newData $myArray[$id]['code']
    Или же делать запрос к базе по ид который был найден ранее.

    Когда у тебя будут данные для замены можешь делать
    PHP:
    echo str_replace($regs[0],$newData,$subject);
    Причем учти что если тагов может быть больше чем один, то нужно использовать preg_match_all и потом делать цикл.
     
    latteo и The_Wolf нравится это.
  8. The_Wolf

    The_Wolf

    Регистр.:
    21 окт 2013
    Сообщения:
    339
    Симпатии:
    189
    Есть функция интерпретации php кода .
    PHP:
    <?php
    function interpratePHP($element){
    $element preg_replace('/\s{2,}/iu'''$element);
    $result preg_replace_callback('~\[php\](.*)\[\/php\]~ui',
    create_function('$matches',' ob_start(); eval("$matches[1]"); $result = ob_get_contents(); ob_end_clean(); return $result;'), $element);
    return 
    $result;
    }
        echo 
    interpratePHP('[phр]include("1.php");[/phр]');
    ?>
    не работает если у меня :
    PHP:
    echo interpratePHP('[phр]include("1.php");[/phр] ...немного текст... [phр]include("2.php");[/phр]');
    как сделать чтобы всё работал :) ???
    Помогите пожалуйста
     
  9. Alekc

    Alekc Постоялец

    Регистр.:
    9 мар 2014
    Сообщения:
    50
    Симпатии:
    26
    Не используйте preg_replace_callback, У этой функции есть проблемы с памятью при более менее больших обьемах текста.

    Лучше уж preg_match_all + str_replace на каждый елемент.

    После чего... я не знаю что вы пытаетесь сотворить но такое использование eval до добра не доведет, начиная от проблем с безопастностью и кончая проблемами с станными багами которые выходят в самых неожиданных местах...
     
  10. The_Wolf

    The_Wolf

    Регистр.:
    21 окт 2013
    Сообщения:
    339
    Симпатии:
    189
    Вот так сделал :
    PHP:
    <?
    session_start();
    include(
    'inc/config.php');
    mysql_select_db($db['name'],$connect);
    include(
    'inc/func.php');
    //$myHtml = GetInfo::Html('1');
    //$myHtml = base64_decode($myHtml['code']);
    $str 'Тест : [html]1[/html]<br />[html]3[/html]';
    eval(
    '?>'.html_entity_decode(str_replace('[/html]''");echo $myHtml = base64_decode($myHtml["code"]);?>'str_replace('[html]''<? $myHtml = GetInfo::Html("'$str))));
    ?>
    Использую eval . Это безопасно ?