kasperskiy.pl 0 06/28/2013 10:16 PM Версия 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. (с остальными опциями то же самое) Очень прошу помочь) Share this post Link to post Share on other sites
kasperskiy.pl 0 06/28/2013 10:30 PM Кстати те кому нужно скрыть контент от незарегистрированных пользователей: $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) - переводится как "Если группа пользователя равняется по айди группе гостей, то... Share this post Link to post Share on other sites
siv1987 2,623 06/29/2013 08:50 AM В таком случае не правильно применять 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>'; } } Только эти регулярки создадут лишнюю нагрузку, так как пост будет парсится каждый раз при выводе. А чтобы он работал правильно кеширование сообщений придется отключить, иначе пост закешируется от текущего пользователя и в дальнейшим будет отдаваться кеш. 1 Share this post Link to post Share on other sites
siv1987 2,623 06/29/2013 01:18 PM Кстати, тем, кому нужна аццкая регулярка для парсинга таких опций к тегу - 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]; } } Share this post Link to post Share on other sites
kasperskiy.pl 0 06/29/2013 09:20 PM Вот что я понял надо написать, но он не работает почему то((( Share this post Link to post Share on other sites
kasperskiy.pl 0 06/29/2013 09:32 PM А чтобы он работал правильно кеширование сообщений придется отключитьКеширование я отключил) Share this post Link to post Share on other sites
kasperskiy.pl 0 06/29/2013 09:46 PM Походу не работает из за этой строчки >< мб потому что не задан $out Share this post Link to post Share on other sites
siv1987 2,623 06/30/2013 08:15 AM Походу не работает из за этой строчки >Работу ббкода я не тестировал, но код проверялся - все работает. Если нужно, возьмите строчку и протестируйте ее отдельно - $match[1] это строка с опциями. мб потому что не задан $outА это разве не $out? preg_match_all( '/([a-z]+)=([\w]+)/i', $match[1], $out ); Share this post Link to post Share on other sites