bbcode для таблиц

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

Модераторы: xpert13
  1. Wertos

    Wertos Пьянь местная

    Регистр.:
    13 апр 2007
    Сообщения:
    159
    Симпатии:
    36
    Нужно вот такой код
    Код:
    [td col="1" row="2" bgcolor="#000" align="left" valign="top"]текст[/td]
    заменять на такой
    Код:
    <td colspan="1" rowspan="2" bgcolor="#000" align="left" valign="top">текст</td>
    По простому написать можно, но мне нужно проверять наличие допустим col или row и если они есть, добавлять их в замену, если нет то пропускать. И если параметров вообще нет, например
    Код:
    [td]текст[/td]
    то менять просто на
    Код:
    <td>текст</td>
    И ещё важна независимость от расположения, т.е. сначала col потом bgcolor и т.д.

    Такое вообще возможно одной строкой ? А вообще буду рад любым решениям.
     
  2. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    446
    Симпатии:
    319
    PHP:
    str_replace(array('['']'), array('<''>'), $str);
    :crazy:
     
    Wertos нравится это.
  3. Wertos

    Wertos Пьянь местная

    Регистр.:
    13 апр 2007
    Сообщения:
    159
    Симпатии:
    36
    Как вариант, но хотелось бы по другому... Дело в том, что уже много сообщений именно с col и row
     
  4. gooseim

    gooseim Писатель

    Регистр.:
    29 фев 2016
    Сообщения:
    3
    Симпатии:
    0
    PHP:
    preg_match("#(\[(\w+)\s+(.*?)\])(.*?)(\[/w+\])#"$input$matches);
    $tag $matches[2];
    $attrs $matches[3];
    $content $matches[4];
    $arr explode(" "$attrs);
    $output = array();
    foreach(
    $item as $arr){
      
    $d explode(" "$item);
      if(
    $d[0]== "col")
       
    $output[] = 'colspan="'.   $d[1] . '"';
      else if(
    $d[0] == "row")
       
    $output[] = 'rowlspan="'.   $d[1] . '"';
      else
       
    $output[] = $item;
    }

    $res  implode(" "$output);
    $res "<$tag $res>$content</$tag>";
     
  5. gooseim

    gooseim Писатель

    Регистр.:
    29 фев 2016
    Сообщения:
    3
    Симпатии:
    0
    Хотя можно проще:
    PHP:
    $str str_replace(array('['']'), array('<''>'), $str);
    $str preg_replace("#\b(col|row)\b#""$1span"$str);
     
  6. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    251
    Замени дополнительно str_replace(array('col', 'row'), array('colspan', 'rowspan'), $str);
     
  7. Wertos

    Wertos Пьянь местная

    Регистр.:
    13 апр 2007
    Сообщения:
    159
    Симпатии:
    36
    Там же есть и другие ббкоды, которые в $str. И везде позаменяет [ на < хотя не везде нужно !
     
  8. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    251
    Wertos нравится это.
  9. Wertos

    Wertos Пьянь местная

    Регистр.:
    13 апр 2007
    Сообщения:
    159
    Симпатии:
    36
    Почти, только тут зависит от местоположения, если поменять местами row и col то не работает, также если удалить, ведь юзер может написать и просто [td col="2"] и всё...
     
  10. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    457
    Такие задачи не решаются регулярными выражениями. Нет, конечно реально наворотить регулярку которая будет учитывать парметры тега в любой последовательности, но не дай бог вам нужно будет в этой регулярке что-то изменить или подправить. Проще всего регуляркой искать такие теги, а уже преобразовывать в правильный вариант с помощью ЯП.