ФорумПрограммированиеPHP для идиотов → Help: regexp распилить текст на разделы

Help: regexp распилить текст на разделы

  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 3 апреля 2011 г. 11:37, спустя 7 часов 5 минут 50 секунд

    Что-то я тубплю с недосыпа. Выручайте!
    Предположим есть такой текст:

    ###alpha###
    blablabla
    dsdsdsjlk
    ###beta###
    foo
    bar
    sd jaj sak
    saklas
    3452###sigma###
    ###gama###
    4
    ###INTRO###
    Introduction

    There are: alpha, beta & gama

    Здесь "заголовки" начинаются с начала строки и окружены шарпами. В примере sigma - не заголовок, т.к. не с начала строки.
    Надо порезать текст в массив:

    array('alpha' => 'blablabla', 'beta' => 'foobar', …);

    хочется использовать preg_match() или preg_match_all() для раскусочивания.
    Спустя 263 сек.
    Я даже имею почти то что надо. См:

    <?php

    $str = <<<FOO
    a: 1
    b: 2
    c: 3
    FOO;

    preg_match_all('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
    var_export(array_combine($matches['name'], $matches['digit']));

    Выводит
    array ( 'a' => '1', 'b' => '2', 'c' => '3', )

    Но вот с многострочным текстом не получается.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 3 апреля 2011 г. 4:31, спустя 16 часов 54 минуты 10 секунд

    $txt = "###alpha###
    blablabla
    dsdsdsjlk
    ###beta###
    foo
    bar
    sd jaj sak
    saklas
    3452###sigma###
    ###gama###
    4
    ###INTRO###
    Introduction

    There are: alpha, beta & gama";

    $test = preg_split("!^###([^#]+)###(.*?)!m", $txt, 0, PREG_SPLIT_DELIM_CAPTURE);
    $test = array_filter(array_map("trim", $test));
    app::debug($test);


    array_filter - в данном случае костыль, но я чето нихуя не помню поведение прег сплита … он какие то доп поля промежуточные пустые возвращает … дибилизм) может у меня конечно пхп с багом я хз. либо я чтото непомню и не понимаю, простительно, уже 5 утра практически )
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 3 апреля 2011 г. 18:13, спустя 13 часов 41 минуту 45 секунд

    Спасибо дуд. Я сейчас уже использую preg_split с доп. обработкой на PHP, оно конечно работает, но радости не приносит ))) Вот preg_match_all + array_combine было бы реально красивым решением, только правильную регулярку надо найти!
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!