За последние 24 часа нас посетили 17898 программистов и 1641 робот. Сейчас ищут 1446 программистов ...

Вложенность бб-кодов

Тема в разделе "Регулярные выражения", создана пользователем vvsh, 19 авг 2009.

  1. vvsh

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

    С нами с:
    19 май 2009
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Беларусь, Минск
    здравствуйте, такой вопрос, у меня есть замена с помощью регулярного выражения:
    Код (Text):
    1. $body = preg_replace("#\[size\=(1|2|3|4|5|6|7|8])\](.*)\[/size\]#isU", "<font size=\"$1px\">$2</font>", $body);
    вот текст для замены:
    Код (Text):
    1. [size=1]
    2. малый текст
    3.  
    4. [size=3]средний[/size]
    5.  
    6. [size=4]большой[/size]
    7. [/size]
    как сделать так, чтобы обрабатывалось не так:
    Код (Text):
    1. <font size="1px">
    2. малый текст
    3.  
    4. [size=3]средний</font>
    5.  
    6. <font size="4px">большой</font>
    7. [/size]
    а так:

    Код (Text):
    1. <font size="1px">
    2. малый текст
    3.  
    4. <font size="3px">средний</font>
    5.  
    6. <font size="4px">большой</font>
    7. </font>
    заранее спасибо
     
  2. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Вручную считать вложенность, по этой теме уже был топик, на phpClub тоже обсуждали.

    Код (Text):
    1. <block>
    2.     <block>
    3.         <block></block>
    4.         <block></block>
    5.     </block>
    6.     <block></block>
    7. </block>
    8. <block>
    9.     <block></block>
    10. </block>
    Вот для того, чтобы такое разгрести, существуют конечные автоматы.
    Так что удачи =)

    Кроме того, дам только одну подсказку:

    Отвратительно, писать надо так (и не экранировать знак равно):

    \[size=([1-8]{1})\]
     
  3. vvsh

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

    С нами с:
    19 май 2009
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Беларусь, Минск
    вы можете дать ссылку на тему про вложенность?
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а так - бред

    Такая проблема может возникнуть с другими ББ кодами но никак не с Size
    в таких случаях, заменять следует по одному, тоесть отдельно открывающий и закрывающий теги
    парность контролировать этой функцией
    PHP:
    1. <?
    2. function bbcontrol($text,$thisbb) {
    3.         for($i=0,$c=count($thisbb);$i<$c;$i++) {
    4.            preg_match_all("#\[(".$thisbb[$i].")\]#isU",$text,$openbb);
    5.            preg_match_all("#\[\/(".$thisbb[$i].")\]#isU",$text,$closebb);
    6.            if (count($openbb[1])>count($closebb[1])) {
    7.                if (preg_match("#\[\/".$thisbb[$i]."\]#is",$text)) {
    8.                     $exp=explode("[/".$thisbb[$i]."]",$text);
    9.                 for($z=0,$k=count($openbb[1])-count($closebb[1]);$z<$k;$z++) {
    10.                     $exp[0].="[/".$thisbb[$i]."]";
    11.                 }
    12.                 $text=join("[/".$thisbb[$i]."]",$exp);
    13.               } else {
    14.                 $text=str_replace("[".$thisbb[$i]."]","[".$thisbb[$i]."&#093",$text);
    15.               }
    16.            }else if (count($openbb[1])<count($closebb[1])) {
    17.                if (preg_match("#\[".$thisbb[$i]."\]#is",$text)) {
    18.                    $exp=explode("[".$thisbb[$i]."]",$text);
    19.                    for($z=0,$k=count($closebb[1])-count($openbb[1]);$z<$k;$z++) {
    20.                        $exp[0].="[".$thisbb[$i]."]";
    21.                    }
    22.                    $text=join("[".$thisbb[$i]."]",$exp);
    23.                }else {
    24.                    $text=str_replace("[/".$thisbb[$i]."]","[/".$thisbb[$i]."&#093",$text);
    25.                }
    26.            }
    27.         }
    28.         return $text;
    29.   }
    30. ?>
     
  6. kostyl

    kostyl Guest

    а если хочешь че посложнее просто возьми готовую библу типа XBB
     
  7. vvsh

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

    С нами с:
    19 май 2009
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Беларусь, Минск
    там эти библы фиг знает какие, лень разбирать.
     
  8. vvsh

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

    С нами с:
    19 май 2009
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Беларусь, Минск
    Mr.M.I.T., спасибо большое за функцию контроля.