Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбитие категорий и подкатегорий 
:(
    Опции темы
Aliance
Дата 10.3.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 2
Всего: 137



Доброго всем времени суток! И снова у меня проблема с составлением регулярки, прошу помощи.
Имеется текст вида:
Цитата

"раздел 1"
подраздел 1
"раздел 2"
подраздел 1
подраздел 2
подраздел 3
"раздел 3"
"раздел 4"
подраздел 1
подраздел 2


Таким образом получается:
- в разделе 1 - один подраздел
- в разделе 2 - три
- в разделе 3 - ни одного
- в разделе 4 - два

Нужно имеющийся текст распарсить.
Я смог выцепить только разделы, но соотнести к ним подразделы не получилось.

Код

// $page - это строка с имеющимся текстом

if ( preg_match_all( '|"([А-я:\s,]+)"|mU', $page, $matches, PREG_SET_ORDER ) )
{
    echo '<pre>';
    print_r( $matches );
    echo '</pre>';
}


Есть пока только одна мысль - использовать PREG_OFFSET_CAPTURE и вырезать нужные строки ф-цией substr()
PM MAIL WWW ICQ Skype   Вверх
Aliance
Дата 10.3.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 2
Всего: 137



В итоге я сделал как и думал через PREG_OFFSET_CAPTURE:
Код

<?php

$page = <<<EOF
"раздел 1"
подраздел 1.1
"раздел 2"
подраздел 2.1
подраздел 2.2
подраздел 2.3
"раздел 3"
"раздел 4"
подраздел 4.1
подраздел 4.2
EOF;

$sections = array();

$re = '|^"(.*?)"|m';
if ( preg_match_all( $re, $page, $matches, PREG_OFFSET_CAPTURE ) )
{
    for ( $i = 0; $i < count( $matches[0] ); $i++ )
    {
        $std = new stdClass();
        $std->title = $matches[0][$i][0];
        if ( $i == count( $matches[0] ) - 1 )
        {
            $item = substr( $page, $matches[0][$i][1] + strlen( $matches[0][$i][0] ), strlen( $page ) );
            $items = explode( "\n", trim( $item ) );
            $std->items = $items;
        }
        else
        {
            $item = substr( $page, $matches[0][$i][1] + strlen( $matches[0][$i][0] ), $matches[0][$i+1][1] - ( $matches[0][$i][1] + strlen( $matches[0][$i][0] ) ) );
            $items = explode( "\n", trim( $item ) );
            $std->items = $items;
        }
        $sections[] = $std;
    }
}
else
{
    echo 'none';
}

echo '<pre>';
print_r( $sections );
echo '</pre>';

?>


Может быть у кого-нибудь появится более изящное решение?
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 10.3.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



логика в том, что разделы - в кавычками, а подразделы - без?
PM MAIL   Вверх
Aliance
Дата 11.3.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 2
Всего: 137



Не совсем. Тут учитывать стоит вложенность.
То есть сперва идет в кавычках название раздела, а все что после него и до следующего - это содержание раздела.
Я точно знаю, что это можно распарсить одной регуляркой.
Я думаю что примерно так: ("раздел")\n(все остальное, кроме кавычки) и второй карман потом просто explode( "\n" )
PM MAIL WWW ICQ Skype   Вверх
Aliance
Дата 17.3.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 2
Всего: 137



Ни у кого нет мыслей?
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 17.3.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



разбить на строки и перебирать в цикле.
в отдельной переменной хранить имя текущего раздела.
когда встречается строка в кавычках, записывать название в переменную "текущий раздел".
если строка без кавычек, то трактуем как подраздел и связываем подраздел с разделом, указанном в переменной "текущий раздел".
PM MAIL   Вверх
unicross
Дата 17.3.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 5
Всего: 53



Код

<?php
$str = <<<EOF
"раздел 1"
подраздел 1.1
"раздел 2"
подраздел 2.1
подраздел 2.2
подраздел 2.3
"раздел 3"
"раздел 4"
подраздел 4.1
подраздел 4.2
EOF;
$result = array();
$pattern = '#"([^"]+)"\s+([^"]*)#s';
preg_match_all($pattern, $str, $res, PREG_SET_ORDER);
$count = count($res);
for ($i=0; $i<$count; $i++) {
   $result[$i] = array($res[$i][1]);
   $res[$i][2] = trim($res[$i][2]);
   if (strlen($res[$i][2])>0) {
      $arr = explode("\n", $res[$i][2]);
      foreach ($arr as $v) $result[$i][] = trim($v);
   }
}
print_r($result);
?>

Результат
Код

Array
(
    [0] => Array
        (
            [0] => раздел 1
            [1] => подраздел 1.1
        )

    [1] => Array
        (
            [0] => раздел 2
            [1] => подраздел 2.1
            [2] => подраздел 2.2
            [3] => подраздел 2.3
        )

    [2] => Array
        (
            [0] => раздел 3
        )

    [3] => Array
        (
            [0] => раздел 4
            [1] => подраздел 4.1
            [2] => подраздел 4.2
        )

)

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.