Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Запрет выполнения bb-кодов внутри другого кода

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Okula
Отправлено: 25 Июля, 2013 - 19:26:59
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Давненько я не программировал и вот решил опять заняться этим делом. Стоит такая задача - отключить исполнение bb-кодов внутри определённого кода (пусть это будет bb-код [code]).
Подскажите как реализовать это, а то мысли путаются, а рациональное решение так и не приходит в голову.
 
 Top
Okula
Отправлено: 26 Июля, 2013 - 12:56:57
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Никто идею не подкинет как сделать?
 
 Top
EuGen Администратор
Отправлено: 26 Июля, 2013 - 13:01:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Уверен, в Сети существует множество всевозможных реализаций для замены BB. Ниже приведу результат первой пришедшей в голову идеи:
PHP:
скопировать код в буфер обмена
  1. //rgReplace is an array [bbcode=>string] or [bbcode=>[code_string, attr_string]] - so replace [b] -> <b> and [url=something] -> <a href="something">
  2. function replaceBB($rgReplace, $sData, $sNoBB=null)
  3. {
  4.    $rgReplace  = array_map(function($mReplace)
  5.    {
  6.       return is_array($mReplace)?$mReplace:[$mReplace];
  7.    }, $rgReplace);
  8.    $rgNoBB     = [];
  9.    $rgPatterns = array_map(function($sCode)
  10.    {
  11.       return '/\[('.preg_quote($sCode,'/').')\](.*?)\[\/'.preg_quote($sCode,'/').'\]|\[('.preg_quote($sCode,'/').')\s*\=\s*(.*?)\](.*?)\[\/'.preg_quote($sCode,'/').'\]/smi';
  12.    } ,array_keys($rgReplace));
  13.    if(isset($sNoBB))
  14.    {
  15.       $sData  = preg_replace_callback('/\['.$sNoBB.'\](.*?)\[\/'.$sNoBB.'\]/smi', function($rgMatches) use (&$rgNoBB)
  16.       {
  17.          $rgNoBB[] = $rgMatches[1];
  18.          return '{{'.count($rgNoBB).'}}';
  19.       }, $sData);
  20.    }
  21.    $sData = preg_replace_callback(
  22.       $rgPatterns,
  23.       function($rgMatches) use ($rgReplace)
  24.       {
  25.          $rgMatches = array_values(array_filter($rgMatches, function($sMatch)
  26.          {
  27.             return trim($sMatch);
  28.          }));
  29.          $iText     = count($rgMatches)-1;
  30.          if($iText==3 && isset($rgReplace[$rgMatches[1]][1]))
  31.          {
  32.             return '<'.$rgReplace[$rgMatches[1]][0].' '.$rgReplace[$rgMatches[1]][1].'="'.$rgMatches[2].'">'.$rgMatches[3].'</'.$rgReplace[$rgMatches[1]][0].'>';
  33.          }
  34.          else
  35.          {
  36.             return '<'.$rgReplace[$rgMatches[1]][0].'>'.$rgMatches[$iText].'</'.$rgReplace[$rgMatches[1]][0].'>';
  37.          }
  38.       },
  39.       htmlspecialchars($sData)
  40.    );
  41.    if(count($rgNoBB))
  42.    {
  43.       $sData = preg_replace_callback('/\{\{(.*?)\}\}/smi', function($rgMatches) use (&$rgNoBB)
  44.       {
  45.          return $rgNoBB[$rgMatches[1]-1];
  46.       }, $sData);
  47.    }
  48.    return $sData;
  49. }

Пример
PHP:
скопировать код в буфер обмена
  1. var_dump(replaceBB([
  2.   'b'=>'b',
  3.   'url'=>['a', 'href'],
  4. ],
  5. '[b]test code[/b] and [url=localhost]linked [b]new[/b] data[/url] and so on, but not in [nobb]code [b]restriction[/b] container[/nobb]', 'nobb'));
  6. //string(123) "<b>test code</b> and <a href="localhost">linked <b>new</b> data</a> and so on, but not in code [b]restriction[/b] container"


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Okula
Отправлено: 26 Июля, 2013 - 13:10:02
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




EuGen, ты маленько не понял мой вопрос. У меня уже есть функционал по обработке бб-кодов.
Вот мой код:
PHP:
скопировать код в буфер обмена
  1. class bbCode {
  2.    
  3.     static private $array_bb = NULL;
  4.    
  5.     private function __construct() {}
  6.     private function __clone() {}
  7.     private function __wakeup() {}
  8.    
  9.     /**
  10.      * Получаем массив с ББ кодами из БД
  11.      */
  12.     private static function setBBArrray() {
  13.         if(self::$array_bb == NULL) {
  14.             $mysqli = db::register();
  15.             $query = $mysqli->query("SELECT * FROM `bbcode`");
  16.  
  17.             if($query->num_rows !== 0) {
  18.                 while($bb = $query->fetch_assoc()) {
  19.                     if($bb['admin'] == 1) self::$array_bb['admin'][$bb['regex']] = $bb['result'];
  20.                     if($bb['user'] == 1) self::$array_bb['user'][$bb['regex']] = $bb['result'];
  21.                 }
  22.             }
  23.         }
  24.     }
  25.    
  26.     /**
  27.      * Заменяем ББ коды на HTML код
  28.      *
  29.      * @param string $string исходная строка
  30.      * @param array $array массив с ББ кодами
  31.      * @return string изменённая строка
  32.      */
  33.     private static function bbReplace($string, array $array) {
  34.         $string = preg_replace('~([^=]|^)(https?://(www\.)?([\w\-]+\.)+/?([\w/=\[\],&\~%\.\+\?]+)?/?)~is', '$1<a href="$2" target="_blank">$2</a>', $string);
  35.         foreach($array as $k=>$v) {
  36.             $string = preg_replace($k, $v, $string);
  37.         }
  38.        
  39.         $string = nl2br($string);
  40.        
  41.         $reg = '~\[code=(?P<lang>[a-z\d]+)\](?<source>.+)\[/code\]~isU';
  42.         $string = preg_replace_callback($reg, "self::replaceCode", $string);
  43.        
  44.         return $string;
  45.     }
  46.  
  47.     /**
  48.      * Подсветка синтаксиса
  49.      *
  50.      * @param array $matches [source]=>исходный текст, [lang]=>язык подсветки
  51.      * @return string
  52.      */
  53.     public static function replaceCode(array $matches) {
  54.         $matches['source'] = str_replace('<br />', '', $matches['source']);
  55.         $geshi = new GeSHi\CodeStyle($matches['source'], $matches['lang']);
  56.         $source = $geshi->higlineSintaxis();
  57.         return $source;
  58.     }
  59.  
  60.     /**
  61.      * ББ коды для администратора
  62.      *
  63.      * @param string $string исходная строка
  64.      * @return string
  65.      */
  66.     public static function adminBB($string) {
  67.         self::setBBArrray();
  68.         $string = self::bbReplace($string, self::$array_bb['admin']);
  69.        
  70.         return $string;
  71.     }
  72.    
  73.     /**
  74.      * ББ коды для пользователя
  75.      *
  76.      * @param string $string исходная строка
  77.      * @return string
  78.      */
  79.     public static function userBB($string) {
  80.         self::setBBArrray();
  81.         $string = self::bbReplace($string, self::$array_bb['user']);
  82.        
  83.         return $string;
  84.     }
  85.    
  86. }

Мне нужно сделать так, чтобы при обработке строки бб-кодами пропускался текст внутри тега [code], если он имеется.
 
 Top
EuGen Администратор
Отправлено: 26 Июля, 2013 - 13:16:12
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Okula
Тогда ещё проще. Сделать только первый и третий шаги той функции, что привёл я. А именно - вырезать nobb-части:
PHP:
скопировать код в буфер обмена
  1.    $rgNoBB     = [];
  2.    if(isset($sNoBB))
  3.    {
  4.       $sData  = preg_replace_callback('/\['.$sNoBB.'\](.*?)\[\/'.$sNoBB.'\]/smi', function($rgMatches) use (&$rgNoBB)
  5.       {
  6.          $rgNoBB[] = $rgMatches[1];
  7.          return '{{'.count($rgNoBB).'}}';
  8.       }, $sData);
  9.    }

, затем применить Вашу функцию замены bb, затем вернуть вырезанные nobb-части:
PHP:
скопировать код в буфер обмена
  1.    if(count($rgNoBB))
  2.    {
  3.       $sData = preg_replace_callback('/\{\{(.*?)\}\}/smi', function($rgMatches) use (&$rgNoBB)
  4.       {
  5.          return $rgNoBB[$rgMatches[1]-1];
  6.       }, $sData);
  7.    }

- такое решение хорошо тем, что не зависит от способа замены bb-кодов (обычного, то есть того, которым заменяются bb-коды вне запрещающего тега), и, как следствие, не требуется модификация стороннего кода.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Okula
Отправлено: 02 Августа, 2013 - 02:02:24
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




EuGen, спасибо за подсказку. Сделал немного по другому, разделив текст регулярным выражением:
(то что нужно обработать)(то что не нужно обработать)(то что нужно обработать)
а потом склеил обработанные данные.
Всё обошлось 1-им preg_replace_callback()
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB