Цитирование пользователей на форумах

Я работаю над разделом комментариев для сайта, где пользователи могут цитировать то, что сказал другой пользователь. Это ваша основная кнопка «Цитировать» на форуме.

Для этого используется BBcode. Но не уверен, как добиться результата.

Как обычно делается эта функция?

я могу иметь

[quote=username] some sentence [/quote]

который в идеале должен быть преобразован в

<blockquote>username said:
some sentence
</blockquote>

На данный момент у меня есть код, который преобразует

"[quote=username] ... [/quote]"
 into
 <blockquote> ... </blockquote>

но я теряю имя пользователя

это код, который я использую

// output user comment
echo parse_quote( $row['user_comment'] );


// and this is the function to parse the quote

function parse_quote($str) {
    $str = preg_replace("/\[quote=[\w\s\-\W][^\]]{1,}\]/", "<blockquote>:", $str);  
    $str = preg_replace("/\[\/quote\]/", "</blockquote>", $str);
    return $str;
}

Итак, в двух словах, как обычно делается цитирование на форумах... правильно ли это? Если да, то как я могу преобразовать

[quote=username] some sentence [/quote]

в

<blockquote>username said:
some sentence
</blockquote>

person sqram    schedule 28.08.2009    source источник


Ответы (3)


Попробуйте изменить его на что-то вроде:

function parse_quote($str) {
    $str = preg_replace("/\[quote=([^\]]+)\]/", "<blockquote>$1 said:", $str);  
    $str = preg_replace("/\[\/quote\]/", "</blockquote>", $str);
    return $str;
}

Потребуется немного больше изменений, если вы хотите разрешить людям цитировать без указания имени пользователя, например [quote]какой-то текст[/quote].

person Jason Berry    schedule 28.08.2009

Что ж, я предлагаю одну вещь: вы хотите избежать многократных проходов через ваш файл, и PHP предоставляет довольно удобный способ сделать это, используя preg_replace_callback():

function process_codes($str) {
  return preg_replace_callback('!\[(.+?)\]!', 'process_code', $str);
}

function process_code($matches) {
  if ($matches[1] == '/quote') {
    return '</blockquote>';
  } else if (preg_match('!quote\s*=\s*(.+?)!', $matches[1], $args)) {
    return "<blockquote>$args[1] said:<br><br>";
  }
  // etc
}
person cletus    schedule 28.08.2009

Нет, Форум обычно использует следующий формат:

<div><strong>username</strong> said:</div>
<blockquote>
some sentence
</blockquote>
person Lastnico    schedule 03.11.2009