Jump to content

bbcode из php файла.


kasperskiy.pl
 Share

Recommended Posts

Версия 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. (с остальными опциями то же самое)

 

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

Link to comment
Share on other sites

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

 

$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) - переводится как "Если группа пользователя равняется по айди группе гостей, то...

Link to comment
Share on other sites

В таком случае не правильно применять 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>';
}
}

 

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

  • Upvote 1
Link to comment
Share on other sites

Кстати, тем, кому нужна аццкая регулярка для парсинга таких опций к тегу - 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];
       }
   }

Link to comment
Share on other sites

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

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

 

 

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

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

 

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...