Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: bb-code
 
 автор: sl1p   (24.12.2008 в 11:16)   письмо автору
 
 

<?
preg_replace
('^\[(b|i|u)\](.*)\[/(b|i|u)\]$''<$1>$2</$3>'$_POST['msg']);


нужно чтото типа такого, я думаю с виду понятно:)
заранее спасибки :]

  Ответить  
 
 автор: sl1p   (24.12.2008 в 11:21)   письмо автору
 
   для: sl1p   (24.12.2008 в 11:16)
 

#\[(b|i|u)\](.*)\[/(b|i|u)\]#
как-то так получилось но криво..

а как теперь его заставить заменять парные ббкоды? и во всей строке а не только первое попавшееся?)

  Ответить  
 
 автор: xx77   (24.12.2008 в 13:37)   письмо автору
 
   для: sl1p   (24.12.2008 в 11:21)
 

Думаю как-то так
<? 
echo preg_replace('~\[(b|i|u)\](.*?)\[/\1\]~si''<$1>$2</$1>'$_POST['msg']);

(.*?) будет останавливаться перед первым закрывающим таким-же тегом, а не последним
и без ^$
и ~si можно просто ~s , если не бывает [U]такое[\U], или совсем без модификаторов
, если должно быть тольо одной строкой

  Ответить  
 
 автор: sl1p   (24.12.2008 в 18:16)   письмо автору
 
   для: xx77   (24.12.2008 в 13:37)
 

пасибки огромное, то что нужно:)
а можно если не трудно объяснить это:
~\[(b|i|u)\](.*?)\[/\1\]~si

тут юзается первая переменная прямо в выражении или как?:)

зы. немного косячек:)
[ b][ i][u]kjgfh[/u][/i][/b]
так вот не катит, заменяет только первые, верхние теги, то есть [b][/b]...

  Ответить  
 
 автор: xx77   (24.12.2008 в 19:41)   письмо автору
 
   для: sl1p   (24.12.2008 в 18:16)
 

говорят лучше работает ([biu]) вместо (b|i|u) ,)
а \1 , в нём строка, та что совпала в первой подмаске , та-же в $1 строки замены

// upd:

>немного косячек
так и должно быть :)
атоэто работало-бы медленно-медленно
, и даже медленнее чем если-бы была-бы функция preg_replace_recursive() :)
можно было-бы, просто \(/?[biu])\] заменять на <$1>
но для этого нужно было-бы считать сколько открывающих и закрывающих тегов было
ато-бы лишний [b][b][b][b] изковеркал-бы все последующие сообщения
, или проходить той preg_replace несколько раз

  Ответить  
 
 автор: sl1p   (25.12.2008 в 07:19)   письмо автору
 
   для: xx77   (24.12.2008 в 19:41)
 

хм, ясно:)
[b]тесд[/b]
но вот тут же изменило..только последний повторяющийся тег пропустило:)
[b][i][b]..

  Ответить  
 
 автор: xx77   (25.12.2008 в 19:21)   письмо автору
 
   для: sl1p   (25.12.2008 в 07:19)
 

Тут если заглянуть в код форума , который есть открытый код, то можно найти где-то в папке utils
что заменяется как-то так что сначала проходит preg_replace('~\[b\].*?\[/b\] .....
потом preg_replace('~\[i\].*?\[/i\] .....
и так далее. , можн6о сделать массив выражений для preg_replace

.........................................................

// [b]test[/b] :)

  Ответить  
 
 автор: sl1p   (25.12.2008 в 21:40)   письмо автору
 
   для: xx77   (25.12.2008 в 19:21)
 

ну тогда ок)
просто мне в принципе пог на время обработки,ибо решил сходу пихать в базу изменённое.. так что думаю не трабл..
если не трудно покажите пример замены всей хренотени :)

  Ответить  
 
 автор: xx77   (25.12.2008 в 23:11)   письмо автору
 
   для: sl1p   (25.12.2008 в 21:40)
 

Примерно такое получается если просто удалять все лишние закрывающие теги и закрывать все лишние открытые
<pre><?
$text 
'
[b ][i ][u ]kjgfh[/u][/i]
[i ][/u]kjgfh[/u][/i][/b]
[u ]kjgfh[/u][/i][/b]
[/b][/i][/u]kjgfh[/u][/i][/b]
[b ]kjgfh[/u][/i][/b]
[b ][i][i][i][i][i][i][i][i][i][u]kjgfh[/u][/b]
[/i][/u]kjgfh[/u][/i]
[u ]kjgfh[/u][/i][/b]
[/b][/i][/u]kjgfh[/u][/i][/b]
[b][b][b][b]'
;


function 
partags($mtchs$bool=false) {
 static 
$b=0$i=0$u=0;
 
  if (
$bool) {
   
$mtchs str_repeat('</b>'$b)
    . 
str_repeat('</i>'$i)
    . 
str_repeat('</u>'$u);
   
$b $i $u 0;
   return 
$mtchs;
 }

 if (
$mtchs[1] == '/') {
   if (isset($
$mtchs[2]) && $$mtchs[2] > 0) {
     $
$mtchs[2] -= 1;
     return 
'</' $mtchs[2] . '>'
    } else return 
'';
 }
 else if (isset($
$mtchs[2])) {
   $
$mtchs[2] += 1;
   return 
'<' $mtchs[2] . '>';
  }

   return 
'';
}


echo 
htmlspecialchars(
  
$text preg_replace_callback('~\[(/?)(\w)\]~''partags'$text)
  . 
partags(''1
  
// последний вызов функции добывит закрытие всех незакрытых тегов
  
);
?>

можно переделать чтобы теги не удалялись , а просто не преобразовывались
, или чтобы не ограничивать только теми тегами которые объявлены как переменные
$b=0, $i=0, $u=0;, придётся делать массивами.

Но думаю лучше не разрешать пользователям вставлять столько разметки в свои страницы , а сделать проще, как на этом форуме например, не сильно креативным авторам достаточно пары-тройки preg_replace

  Ответить  
 
 автор: sl1p   (26.12.2008 в 08:01)   письмо автору
 
   для: xx77   (25.12.2008 в 23:11)
 

печально =(

  Ответить  
 
 автор: xx77   (26.12.2008 в 14:48)   письмо автору
 
   для: sl1p   (26.12.2008 в 08:01)
 

я вообще у себя когда-то делал попроще
<?
function d_new($match) {
 global 
$tra$smile$mnemo;
 if (isset(
$match[1])) return (($as array_search($match[0], $mnemo)) === false ) ? $match[0]: $smile[$as];
 else return (
$tra) ? htmlspecialchars(translit($match[0])): htmlspecialchars($match[0]);
}
// здесь массивы  $smile, $mnemo это смайлики типа .wink. 
// $tra - это включили-ли транслит


$msg preg_split('#\[cod\](.*?)(?:\[/cod\]|$)#si'$msg, -1PREG_SPLIT_DELIM_CAPTURE);
// разбивал ничем не обработанный текст на код или не код

$i 0$text '';
while((
$tmp array_shift($msg)) !== NULL)
{
 
$text .= (($i++)%2) ? "\n" '<span class="code"><pre>' htmlspecialchars($tmp) . '</pre></span>' "\n"preg_replace_callback('#\.([a-z0-9]+\.)|[^\.]+#s''d_new'$tmp);
}
// и в цикле заменял смайлы и вставлял код в такой контейнер где добавлялась прокрутка
если вставляли слишком длинные строки вместо htmlspecialchars можно вставить подсветку

и никаких bb-кодов , ибо я и сам всё уже разукрасил :)

  Ответить  
 
 автор: sl1p   (27.12.2008 в 10:56)   письмо автору
 
   для: xx77   (26.12.2008 в 14:48)
 

ясненько..
спасибо огромное за помощь =)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования