Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

 

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

Рекомендованные сообщения

Опубликовано:
  • Автор

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

 

$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];
       }
   }

Опубликовано:
  • Автор

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

Опубликовано:
  • Автор

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

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

Опубликовано:
  • Автор

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

Опубликовано:

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

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

 

 

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

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

 

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

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

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.