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

Форум PHP

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

 

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

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

тема: Проверка перекрещенности тегов....
 
 автор: Sfinks   (02.01.2007 в 11:31)   письмо автору
 
 

Сперва проверка, затем сформулирую вопрос.....
проверка перекрещенности тегов

   
 
 автор: Sfinks   (02.01.2007 в 11:39)   письмо автору
 
   для: Sfinks   (02.01.2007 в 11:31)
 

Ага! Вижу у Вас эта проблема тоже не учтена! Но Вам проще, у Вас html...
Проблема в том, что в xml-документах, таких как xhtml, wml, rss и пр., на структуру
<b>проверка <i>перекрещенности</b> тегов</i>
браузер начинает ругаться и выдает ошибку разбора XML!
Вот я и не могу придумать, как этого избежать =(
Кодом
<?php
    $text 
preg_replace("|\[i\](.*?)\[/i\]|i","<i>\$1</i>",$text);
    
$text preg_replace("|\[b\](.*?)\[/b\]|i","<b>\$1</b>",$text);
?>
тут уже не обойдешься.
У кого-нибудь есть идеи?

   
 
 автор: Valick   (02.01.2007 в 11:55)   письмо автору
 
   для: Sfinks   (02.01.2007 в 11:39)
 

Не могу понять в какой ситуации может возникнуть такая проблема, даже в HTML недопускаю перекрещенность (по моему мнению всё должно не только работать, но и выглядеть на все сто!), но не все такие педанты как я)))
Нужен алгоритм. Можно попробовать организовать массив-стек открывающих и закрывающих тегов и если закрвающий тег отличен от открывающего автоматически вставлять закрывающий тег откытого на момент проверки тега перед ним.

   
 
 автор: Valick   (02.01.2007 в 12:01)   письмо автору
 
   для: Sfinks   (02.01.2007 в 11:39)
 

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

   
 
 автор: Sfinks   (02.01.2007 в 13:22)   письмо автору
 
   для: Valick   (02.01.2007 в 12:01)
 

Речь идет не о верстке страниц мною, а о подмене тегов в мессагах посетителей гостевой, форума и т.п. Т.е. о так называемом BB-CODE. Это я знаю, что такое вложенность, ты знаешь, программеры и верстальщики знают.... А также знают всяческие вредители! А простые посетители вполне могут написать так, как я показал в примере.

> Организовать массив-стек открывающих и закрывающих тегов.....
Для этого нужно делать цыкличную посимвольную проверку введенного посетителем текста. Это непозволительно долго!

   
 
 автор: Sfinks   (02.01.2007 в 13:25)   письмо автору
 
   для: Valick   (02.01.2007 в 12:01)
 

> скажи наконец в какой ситуации у тебя происходить перекрещенность, а то с ума сойду
Наглядный пример перекрещенности в первом посте этой темы! Если бы этот форум был не HTML, a xHTML, большинство браузеров не отображало бы эту страницу!

   
 
 автор: Valick   (02.01.2007 в 14:25)   письмо автору
 
   для: Sfinks   (02.01.2007 в 13:25)
 

Я уже и сам догадался, да позновато.... после нового года башка быстро не варит...
Ну а что по поводу моей бредовой идеи? Должно получиться что-то вроде
<b>пример <i>перекрещивающихся </i><b></b>тегов <i></i></b>
а потом или сразу пустые теги можно вообще выкинуть

   
 
 автор: Sfinks   (09.01.2007 в 01:21)   письмо автору
 
   для: Sfinks   (02.01.2007 в 11:39)
 

Фух, ёлки! Аж проц дымицо! Но я решил эту задачку =)
Вот, возможно кому-то пригодится:
<?php

  
function teg_biu($text,$tegs = array("b","i","u")){
    if(!
is_array($tegs)) $tegs = array($tegs);
    foreach(
$tegs as $teg){
      
$o_pos stripos($text,"[".$teg."]");
      
$c_pos stripos($text,"[/".$teg."]");
      if(
$o_pos===false && $c_pos===false) continue;
      elseif(
$o_pos===false) { $text "[".$teg."]".$text$text teg_biu($text,$teg); }
      elseif(
$c_pos===false) { $text $text."[/".$teg."]"$text teg_biu($text,$teg); }
      elseif(
$o_pos $c_pos) { $text "[".$teg."]".$text$text teg_biu($text,$teg); }
      else{
        
$beg substr($text,0,$o_pos);
        
$mid teg_biu(substr($text,$o_pos+3,$c_pos-$o_pos-3));
        
$end teg_biu(substr($text,$c_pos+4));
        
$text $beg."<".$teg.">".$mid."</".$teg.">".$end;
      }
    }
    return 
$text;
  }

  
$text "проверка перекрещенности тегов";
  echo 
teg_biu($text);

?>

Результат:

<b>проверка <i>перекрещенности</i></b><i> тегов</i>

   
 
 автор: Евгений Петров   (09.01.2007 в 02:03)   письмо автору
 
   для: Sfinks   (09.01.2007 в 01:21)
 

Такой:
<i><b>text<i>text<b>text</i>text</b>text</i></b>

неправильно разведет

P.S. огромная просьба к cheops'у сделайте тег [notag][/notag] :)

   
 
 автор: Sfinks   (09.01.2007 в 02:57)   письмо автору
 
   для: Евгений Петров   (09.01.2007 в 02:03)
 

Зачем высказывать голословные утверждения, даже не проверив?
Прекрасно разводит!
Вот результат:
<i><b>text<i>text<b><i>text</i>text</b></i></b><b><i>text</i></b></i>

Да, 4 лишних тега... Но главное браузер, не ругается!
А если уж хочется, чтоб и внутри все было красиво, то нет ничего проще, чем написать функцию удаления лишнего...
<?php

  
function trash($text){
    foreach(array(
"b","i","u") as $teg){
      
$s preg_replace("|</".$teg.">([\s]*)<".$teg.">|i","\$1",$text);
      if(
$s !== $text) break;
    }
    if(
$s !== $text$text trash($s);
    return 
$text;
  }

  
$text "<i><b>text<i>text<b><i>text</i>text</b></i></b><b><i>text</i></b></i>";
  echo 
trash($text);

?>

и вот результат:
<i><b>text<i>text<b><i>text</i>text</b>text</i></b></i>

А если речь идет о вложенности повторных тегов, то ето уже проблемы того, кто это писал! Главное, что ето не будет мешать другим и не отрубит гостю или форум.
Можно конечно и это убрать, но, ИМХО, это будет неоправданная трата ресурсов серва, как впрочем и функция trash().

   
 
 автор: Sfinks   (09.01.2007 в 11:05)   письмо автору
 
   для: Sfinks   (09.01.2007 в 02:57)
 

Хотя, если очень хочется, то вот такая функция:
<?php

  
function duble_tegs($text,$tegs = array("b","i","u"),$del=false){
    if(!
is_array($tegs)) $tegs = array($tegs);
    foreach(
$tegs as $teg){
      
$o_pos stripos($text,"<".$teg.">");
      if(
$o_pos===false) continue;
      else{
        if(!
$del){
          
$beg substr($text,0,$o_pos);
          
$end duble_tegs(substr($text,$o_pos+3),$teg,true);
          
$text $beg."<".$teg.">".$end;
        }
        else{
          
$c_pos stripos($text,"</".$teg.">");
          if(
$c_pos $o_pos){
            
$beg substr($text,0,$o_pos);
            
$end duble_tegs(substr($text,$o_pos+3),$teg,true);
            
$text $beg."<".$teg.">".$end;
          }
          else{
            
$text preg_replace("|<".$teg.">(.*?)</".$teg.">|i","\$1",$text,1);
            
$text duble_tegs($text,$teg,true);
          }
        }
      }
    }
    return 
$text;
  }

  echo 
duble_tegs("<i><b>text<i>text<b><i>text</i>text</b>text</i></b></i>")."\n";
  echo 
duble_tegs("<i>text<i>text</i>text<i>text</i>text</i>")."\n";
  echo 
duble_tegs("<b>text<i><b>text</b></i>text<i>text<i>text</i>text</i>text</b>")."\n";

?>

Результат:
<i><b>texttexttexttexttext</b></i>
<i>texttexttexttexttext</i>
<b>text<i>text</i>text<i>texttexttext</i>text</b>

Теперь связка duble_tegs(trash_tegs(teg_biu($text))); правильно разберет и оптимизирует любой набор тегов <b>, <i>, <u> =)

   
 
 автор: Евгений Петров   (09.01.2007 в 14:55)   письмо автору
 
   для: Sfinks   (09.01.2007 в 02:57)
 

А, да, прошу прощения. Вчера ночью мне почему то показалось, что второй тег <i> закрытый.

   
 
 автор: cheops   (02.01.2007 в 13:59)   письмо автору
 
   для: Sfinks   (02.01.2007 в 11:31)
 

Вероятно, ничего лучше, чем парсить код перед добавлением в базу данных и в случае возникновения ошибок сообщать об них пользователю не придумаешь. Я так понимаю тэгов будет вагон и маленькая тележка?

   
 
 автор: Sfinks   (02.01.2007 в 14:49)   письмо автору
 
   для: cheops   (02.01.2007 в 13:59)
 

А если не вагон, есть варианты контроля чеез рег.выр.?
Скажем [b] [u] [i] [url] [img] [mail] и все....

   
Rambler's Top100
вверх

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