Skip to content

bbcode из php файла.

Версия ipb:3.3.4

В файле 'admin/sources/classes/bbcode/custom/defaults.php' как вы уже знаете обрабатываются наши бб коды. так вот:

 

class bbcode_test extends bbcode_parent_class implements bbcodePlugin
{

public function __construct( ipsRegistry $registry, $_parent=null )
{
	$this->currentBbcode	= 'test';

	parent::__construct( $registry, $_parent );
}

protected function _replaceText($txt)
{
	$_tags = $this->_retrieveTags();

	foreach( $_tags as $_tag )
	{
		$txt = preg_replace( "/\[{$_tag}\](.+?)\[\/{$_tag}\]/i", "<div style='color:#00ff00;'>\\1</div>", $txt );


	}

	return $txt;
}
}

 

это бб код 'test' - при написании:

[test] content axaxa tra ta ta [/test]

он нам выведет контент красным цветом:

<div style='color:#00ff00;'> content axaxa tra ta ta </div>

Суть просьбы:

Необходимо добавить опции к тегу на пример:

[test message=15 reputation=23 data=55] content axaxa tra ta ta [/test]

из за чего если в 'defaults.php' написать (Приблизительный по смыслу контент php кода):

 

if ($options['message'])
{
if ($options['message'] >= 0)
{
	$message_return = "<li> {$options['message']} </li>";
}
else
{
	break;
}
}

 

Где $message_return будет равняться 15 так как мы указали в опции message - 15. (с остальными опциями то же самое)

 

Очень прошу помочь)

Featured Replies

  • Author

Кстати те кому нужно скрыть контент от незарегистрированных пользователей:

 

$txt = preg_replace( "/\[{$_tag}\](.+?)\[\/{$_tag}\]/i", "<div style='color:#00ff00;'>\\1</div>", $txt );

 

Поменять на:

 

if ($this->memberData['member_group_id'] == 2)
{
   $txt = preg_replace( "/\[{$_tag}\](.+?)\[\/{$_tag}\]/i", "<div style='color:#ff0000;'>Sign up or log in to your account</div>", $txt );
}
else
{
   $txt = preg_replace( "/\[{$_tag}\](.+?)\[\/{$_tag}\]/i", "<span>\\1</span>", $txt );
}

 

где if ($this->memberData['member_group_id'] == 2) - переводится как "Если группа пользователя равняется по айди группе гостей, то...

В таком случае не правильно применять preg_replace, а preg_replace_callback с функцией которая будет обрабатывать опции и подправить регулярное выражение чтобы они захватывалась одновременно.

 

Например:

 

$txt = preg_replace_callback( "/\[{$_tag}( [^\]]+)?\](.+?)\[\/{$_tag}\]/i", array($this, '_buildOutput'), $txt );

.....

/*
* Согласно регулярному выражению
* $match[1] - options
* $match[2] - content
*/
protected function _buildOutput( $match )
{
$options = array();
$message = '';

//----------------------------
//build options
//----------------------------

if( $match[1] )
{
	preg_match_all( '/([a-z]+)=([\w]+)/i', $match[1], $out );

	for( $i=0; $i<count($out[0]); $i++ )
	{
		$options[ $out[1][$i] ] = $out[2][$i];
	}
}

// Проверяем условия опций
if( $options['message'] AND $this->memberData['posts'] < $options['message'] )
{
	$message .= 'You need '.$options['message'].' posts <br>';
}
if( $options['reputation'] AND $this->memberData['pp_reputation_points'] < $options['reputation'] )
{
	$message .= 'You need '.$options['reputation'].' reputation points <br>';
}

if( $message )
{
	return '<div>'.$message.'</div>';
}
else
{
	return '<div>'.$match[2].'</div>';
}
}

 

Только эти регулярки создадут лишнюю нагрузку, так как пост будет парсится каждый раз при выводе. А чтобы он работал правильно кеширование сообщений придется отключить, иначе пост закешируется от текущего пользователя и в дальнейшим будет отдаваться кеш.

Кстати, тем, кому нужна аццкая регулярка для парсинга таких опций к тегу - posts=2 privet="1" text="dsd'sd dfs sdf":

 

   if( $match[1] )
   {
       preg_match_all( '/([a-z]+)=(["\']?)(?(2)(.+?|\w+))\\2/', $match[1], $out );

       for( $i=0; $i<count($out[0]); $i++ )
       {
           $options[ $out[1][$i] ] = $out[2][$i];
       }
   }

  • Author

Вот что я понял надо написать, но он не работает почему то(((

  • Author

А чтобы он работал правильно кеширование сообщений придется отключить

Кеширование я отключил)

  • Author

Походу не работает из за этой строчки >< мб потому что не задан $out

Походу не работает из за этой строчки >

Работу ббкода я не тестировал, но код проверялся - все работает. Если нужно, возьмите строчку и протестируйте ее отдельно - $match[1] это строка с опциями.

 

 

мб потому что не задан $out

А это разве не $out?

 

preg_match_all( '/([a-z]+)=([\w]+)/i', $match[1], $out );

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.