За последние 24 часа нас посетили 17255 программистов и 1233 робота. Сейчас ищут 1347 программистов ...

поиск пересечения тегов

Тема в разделе "Регулярные выражения", создана пользователем antonn, 3 дек 2007.

  1. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Точнее даже так:
    Есть теги [bam][/bam], не важно, но нужно обработать их пересечения:
    [bam] text [bam] text [/bam] [/bam]
    и пронумеровать:
    [bam1] text [bam2] text [/bam2] [/bam1]

    сталкивался ли кто с такой задачей? а то сижу, и не знаю, с какой стороны подобраться :)
    смотрел в ИПБ реализацию тегов цитирования - так там просто шаблоны выводятся по частям, а не обработка пересечения :(
     
  2. Anonymous

    Anonymous Guest

    Рекурсивная функция, передающая себе параметром вложенность тега, и позицию парсинга.
    Примерчик сейчас набросать не могу.
     
  3. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Используй счетчик: снчала он равен 1, когда встречается [bam] он увеличивается на 1, когда [/bam] уменьшается.
     
  4. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    если бы тут все было так элементрано, я бы не спрашивал :)
    Счетчик использовать конечно нужно, вопрос только - как? :) коснтрукция тегов может быть разной:
    Код (Text):
    1. [bam] text
    2.     [bam] text [/bam]
    3. [/bam]
    4. [bam] text [/bam]
    пока пытаюсь понять, как в phpbb это сделано (чем больше разбираю, тем больше кажется, что это не то %)).
     
  5. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    хм, вроде получилось :)
    PHP:
    1. <?
    2. $text="[bam] text [bam] text [/bam] [/bam] [bam] text [/bam]";
    3.  
    4. function regex_boom($b,$pos_st,$pos_e,$nummer){
    5.     if($pos_st==0){
    6.         $pos_st=strpos($b,"[bam]");
    7.     }
    8.     if($pos_e==0){
    9.         $pos_e=strpos($b, "[/bam]", $pos_st+strlen("[bam]") );
    10.     }
    11.     $teee=substr($b, $pos_st+strlen("[bam]"), $pos_e-$pos_st+1-strlen("[/bam]") );
    12.     if(preg_match("#(\[bam\:00\])#is",$teee)){
    13.         $pos_stt=$pos_st+strlen("[bam]")+strpos($teee,"[bam]");
    14.         return regex_boom($b,$pos_stt,$pos_e,$nummer);
    15.     }else{
    16.         $pre=substr($b,0,$pos_st);
    17.         $ende=substr($b,$pos_e+strlen("[/bam]"),strlen($b));
    18.         $center="[bam:0".$nummer."]".substr($b,$pos_st+strlen("[bam]"),$pos_e-$pos_st+1-strlen("[/bam]"))."[/bam:0".$nummer."]";   
    19.         return $pre.$center.$ende;
    20.     }
    21. }
    22.  
    23. function regex_table_boom($b){
    24.     $maat=array();
    25.     $open_tag_count=preg_match_all("#(\[bam\])#is",$b,$maat);
    26.     if($open_tag_count>0){
    27.         $b=str_replace("[bam]", "[bam]", $b);
    28.         $b=str_replace("[/bam]", "[/bam]", $b);
    29.     }
    30.  
    31.     //echo "Count open tag: ".$open_tag_count."<br><br>";
    32.  
    33.     for ($i = 0; $i<$open_tag_count; $i++){
    34.         $b=regex_boom($b,0,0,($i+1));      
    35.     }
    36.  
    37.     return $b;
    38. }
    39.  
    40. $bbf=regex_table_boom($text);
    41. echo "<br><br><br>Out: ".$bbf;
    42.  
    блин, как тут подстветка включается?
     
  6. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    для подсветки нужен тег <? в начале листинга