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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> повтор регулярного выражения, как захватить выражение в цикле? 
V
    Опции темы
merge
Дата 1.2.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Код

1 гг
начало
1 пункт
2 пункт
абракадабра
2 гг


Мне нужно извлечь все пункты списка после тэга "начало" таким образом, чтобы я мог потом получить массив из них, т.е. в результате должно быть
[0] == '1 пункт'
[1] == '2 пункт'

Вот так можно захватить начало списка
Код

начало.*?(?:\d[^\r]*)


как мне это реализовать?

Это сообщение отредактировал(а) merge - 1.2.2008, 14:34
PM MAIL   Вверх
GeneralElectric
Дата 1.2.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 0
Всего: 16



ну, может, регулярными и можно, но я бы не стал париться, и делал preg_match_all...
PM MAIL   Вверх
merge
Дата 1.2.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



я отредактировал главное сообщение, уточнил. тут в моем случае не совсем все просто
PM MAIL   Вверх
GeneralElectric
Дата 1.2.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 0
Всего: 16



Уточнения не понял. как описать условие "те, которые не должны быть захваченные" в синтаксисе регулярных выражений, мне неизвестно.
но на применении preg_match_all не настаиваю. Я написал только то, что сам бы в подобном случае воспользовался ей.
PM MAIL   Вверх
merge
Дата 1.2.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



как-бы вы поступили, если надо было-бы вытащить каждый пункт списка между строками "начало списка:" и "конец". какое регулярное выражение использовали-бы...

Код

текст
начало списка:
1- захватываемое
2- захватываемое 2
3- захватываемое 3
конец

3- не захватываемое
4- не захватываемое 2


Это сообщение отредактировал(а) merge - 1.2.2008, 13:00
PM MAIL   Вверх
onsql
Дата 1.2.2008, 13:07 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 3



Лично я бы даже и думать не стал!
Код


function foo($text) {
  if (! preg_match('/начало списка:(.*?)конец/si', $text, $matches))
    return false;

  $text = $matches[1];

  if (! preg_match_all('/(\d+)- (захватываемое\s*\d*)/si', $text, $matches, PREG_SET_ORDER))
    return false;

  $arr = array();
  foreach ($matches as $match)
   $arr[$match[1]] = $match[2];
  return $arr;
}


smile

Это сообщение отредактировал(а) onsql - 1.2.2008, 13:11
PM MAIL   Вверх
merge
Дата 1.2.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



т.е. без дополнительного кода никак? ладно. я просто думал - может можно встроеными средствами regexp реализовать
PM MAIL   Вверх
merge
Дата 1.2.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



PS ниже написан пост, решение, которое указано выше, для него не подходит, т.к. нету именно метки конца списка. мы должны узнать это по несовпадении маски пункта (т.е. когда маска пункта несовпадет - значит конец списка).

Есть код
Код

1 гг
начало
1 пункт
2 пункт
абракадабра
2 гг


Мне нужно извлечь все пункты списка после тэга "начало" таким образом, чтобы я мог потом получить массив из них, т.е. в результате должно быть
[0] == '1 пункт'
[1] == '2 пункт'

Вот так можно захватить начало списка
Код

начало.*?(?:\d[^\r]*)


как мне захватить все элементы списка?

Это сообщение отредактировал(а) merge - 1.2.2008, 15:11
PM MAIL   Вверх
sTa1kEr
Дата 1.2.2008, 17:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

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



Цитата(merge @  1.2.2008,  15:32 Найти цитируемый пост)
PS ниже написан пост, решение, которое указано выше, для него не подходит, т.к. нету именно метки конца списка.

Таже функция onsql, только сопоставляем конец списка с переносом строки, после которого нету соответствия с шаблоном.
Код

$str = <<< EOS
1 гг
начало
5 f
1 пункт
2 пункт
абракадабра
2 гг
EOS;

function matchesPunkts($start, $pattern, $text)
{
    if (!preg_match("/(?:^|\n)$start(.*?)\n(?!$pattern)/is", $text, $matches))
    {
        return false;
    }

    $result = explode("\n", $matches[1]);
    unset($result[0]); // В такой регулярке первый элемент лишний... :)
    return $result;
}

var_dump(matchesPunkts("начало", "\d+\s+[^\n]+", $str));

Вывод:
Код

array(3) {
  [0]=>
  string(3) "5 f"
  [1]=>
  string(12) "1 пункт"
  [2]=>
  string(12) "2 пункт"
}


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


 




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


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

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