За последние 24 часа нас посетили 20219 программистов и 1079 роботов. Сейчас ищут 730 программистов ...

Не получается исправить ошибку при редактировании текста

Тема в разделе "PHP для новичков", создана пользователем hardway, 22 июн 2019.

Метки:
  1. hardway

    hardway Новичок

    С нами с:
    12 июн 2018
    Сообщения:
    24
    Симпатии:
    0
    Допустим, что у нас есть следующий текст, помещённый в переменную:
    [QUOTE name=hardway]text[/QUOTE]​
    Мне нужно, чтобы из этого текста копировалось значение name (в моём случае — hardway) в переменную $name и удалялось всё, начиная от пробела после [QUOTE и до ]. После остаётся следующая строка:
    [QUOTE]text[/QUOTE]
    Далее заменяем [QUOTE] и [/QUOTE] на
    <div class="title_quo fs12"><div class="mgb7">Сообщение от <strong>'.$name.'</strong></div><em>
    и
    </em></div>
    соответственно.​
    Реализовал я это всё следующим кодом:
    PHP:
    1. $text = '[QUOTE name=hardway]text[/QUOTE]';
    2.     $res = mb_strpos($text, '[QUOTE name=');
    3.     if ($res || $res == 0) {
    4.         $start = $res + 12;
    5.         $p = $start;
    6.         for ($x = 0; $x < 20; $x++) {
    7.             if (mb_substr($text, $p, 1, 'utf-8') != ']') $p++;
    8.             else break;
    9.         }
    10.         $quo_2 = mb_strpos($text, '[/QUOTE]');
    11.         if (mb_substr($text, $start, 1, 'utf-8') == ']' && $quo_2) {
    12.             $length = $p - $start;
    13.             $name = mb_substr($text, $start, $length);
    14.             $text = str_replace($name, '', $text);
    15.             $text = str_replace(' name=', '', $text);
    16.             $replace_1 = '<div class="title_quo fs12"><div class="mgb7">Сообщение от <strong>'.$name.'</strong></div><em>';
    17.             $replace_2 = '</em></div>';
    18.             $text = str_replace('[QUOTE]', $replace_1, $text);
    19.             $text = str_replace('[/QUOTE]', $replace_2, $text);
    20.             $ex = mb_strpos($text, '</em></div>');
    21.             $ex = $ex + 10;
    22.             $text_quo = mb_substr($text, $res, $ex);
    23.         }
    24.     }
    25.     echo $text_quo
    Но, по какой-то мне непонятной причине, на выходе я получаю это:
    </strong>hardway]text[/QUOTE]
    вместо этого:
    <div class="title_quo fs12"><div class="mgb7">Сообщение от <strong>hardway</strong></div><em>text</em></div>​
    Единственное, что я понял, так это то, что в переменной length не записывается разница переменных p и start, но почему это так происходит — хз, ведь переменная p — 19, а start — 12, то есть в результате должно быть 7
     
  2. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    В 11й строчке вместо $start по идее должно быть $p
    22я строчка вообще непонятно зачем

    Но лично я сделал бы так:
    quote.html
    HTML:
    1. <div class="title_quo fs12">
    2.     <div class="mgb7">
    3.         Сообщение от <strong>{name}</strong>
    4.     </div>
    5.     <em>{text}</em>
    6. </div>
    quote.php
    PHP:
    1. $text = '[QUOTE name=hardway]text[/QUOTE]';
    2. $reg = '/\[QUOTE\s+name=(\w+)\]([^\[]*)\[\/QUOTE\]/ui';
    3. if (preg_match($reg, $text, $matches)) {
    4.     $html = file_get_contents('quote.html');
    5.     echo str_replace(['{name}', '{text}'], array_slice($matches, 1), $html);
    6. }
     
  3. hardway

    hardway Новичок

    С нами с:
    12 июн 2018
    Сообщения:
    24
    Симпатии:
    0
    @Maputo, да, ошибка была в 11-й строке. А так, конечно, твой вариант более целесообразнее. Спасибо!