Php. запрет тегов

Модератор: Модераторы разделов

Аватара пользователя
ezheg
Сообщения: 258
Статус: джидай 3-го уровня
ОС: Mac OS X

Php. запрет тегов

Сообщение ezheg »

объясните пожалуйста,как сделать корректную обработку тегов в сообщении.
я нашел только 2 функции
HtmlSpecialChars и strip_tags
я хочу запретить все теги кроме парных <b></b> и <img></img>
с помощья первой функции я могу только запретить все теги,а с помощью второй - не знаю как сделать обработку парности тега,т.е я делаю strip_tags($msg,"<b>") и если сообщение содержит и открывающий и закрывающий теги <b> то все работает,если тег только один то весь остальной текст идет жирным.
Как сделать,если тег не закрыт,чтобы он просто вывелся как тег,а если закрыт - обработался?
Спасибо сказали:
Аватара пользователя
demongloom
Сообщения: 454
Статус: Добрый Демон

Re: Php. запрет тегов

Сообщение demongloom »

задачка не сложная но решать будет занудно.
попытайся через хмл парсинг...

там просто сразу покажет состояние тэга. открыт, закрыт и т.д.
Если жизнь твоя порвется, тебе новую сошьют.
Спасибо сказали:
Аватара пользователя
Sonic
Сообщения: 478

Re: Php. запрет тегов

Сообщение Sonic »

Вот можно так

Код: Выделить всё

<?php
  // Исходная строка
  $postbody = "[ b]Это[ /b] очень жирный [ b]текст[ /b].";
  // Результирующая строка
  $result = "";
  // Вспомогательные переменные
  $lastocc = 0;
  $sndocc = 1;
  while($sndocc)
  {
    // Начало жирного фрагмента
    $fstocc = strpos($postbody, "[ b]", $lastocc);
    // Завершение жирного фрагмента
    $sndocc = strpos($postbody, "[ /b]", $fstocc);
    if(($fstocc>0 && $sndocc>0 && $lastocc>0) || ($fstocc >= 0 && $sndocc>0 && $lastocc == 0))
    {
      // Помещаем фрагмент до тега [ b] в строку $result
      $result .= substr($postbody, $lastocc, $fstocc - $lastocc);
      // Жирный фрагмент
      $result .= "<b>".substr($postbody, $fstocc + 3, $sndocc - $fstocc - 3)."</b>";
      $lastocc = $sndocc + 4;
    }
    else
    {
      // Подбираем остатки строки
      $result .= substr($postbody,$lastocc,strlen($postbody)-$lastocc);
      // Выходим из цикла
      break;
    }
  }
  echo $result;
?>

Или без проверки закрытия, то есть на совести юзера, то вот так... :new_smile:

Код: Выделить всё

<?php
    // Исходная строка
    $postbody = "[ b]Это[ /b] очень жирный [ b]текст[ /b].";
    $postbody = str_replace("[ b]","<b>",$postbody);
    $postbody = str_replace("[ /b]","</b>",$postbody);
    echo $postbody;
?>

Sonic добавил в 26.12.2004 12:15
Только надо будет писать не <b>, а как на этом и всех других форумах.
[b]Sonic
добавил в 26.12.2004 12:16
За дырявость и красоту кода я не отвечаю взял тут: ссылка
LinuxForum.ru :: Форум пользователей ОС Linux
Спасибо сказали:
Аватара пользователя
ezheg
Сообщения: 258
Статус: джидай 3-го уровня
ОС: Mac OS X

Re: Php. запрет тегов

Сообщение ezheg »

It Works!
piton3000 добавил в 26.12.2004 15:38
Спасибо большое за помощь,с тегами даже лучше! У самого мозгов не хватило.. :)
Так понимаю идет просто поиск от тега [ b] до [ /b] не смотря на то что юзер может может сделать вложенные теги,хоть это и безсмысленно.
А как это работает на "настоящих" форумах,например здесь?
[b]piton3000
добавил в 26.12.2004 15:54
Проверка [b] 123 [b]
piton3000 добавил в 26.12.2004 15:57
А, понятно,точно так же! :)
Спасибо сказали: