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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> preg_match_all не понимаю как сделать 
:(
    Опции темы
Dup13x
Дата 9.3.2013, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите. У меня есть какой-то шаблон например token, в строке встречается это один и более раз. Как мне вытащить содержимое между этими двумя шаблонами.

token1 foo token2 bar

Мне нужно получить foo и bar
А у меня получается поиск только по шаблону token.

Не понятно что отвечает за взятие символов до следующего совпадения(((
PM MAIL   Вверх
skyboy
Дата 9.3.2013, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



любое число — \d
любое количество идущих подряд чисел — \d+
по описанию не понятно, почему ты должен в результате получить и bar тоже — он же не между двумя token\d+ находится
PM MAIL   Вверх
Arantir
Дата 9.3.2013, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Dup13x, за 
Цитата(Dup13x @  9.3.2013,  10:38 Найти цитируемый пост)
взятие символов
отвечают скобки, а за
Цитата(Dup13x @  9.3.2013,  10:38 Найти цитируемый пост)
до следующего совпадения
 отвечает квантификатор ленивой выборки (человеческим языком - знак вопроса).
Пара примеров, от менее до более универсальных:
Код

/token1 (.*?) token2 (.*?)/
/token\d (.*?) token\d (.*?)/
/token\d+ *(.*?) */


Это сообщение отредактировал(а) Arantir - 9.3.2013, 14:48


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Dup13x
Дата 10.3.2013, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ничего у меня не получается. Напишу то что мне нужно сделать

Есть некоторые наборы строк(привожу 2 примера)
Научный руководитель: Доктор биологических(здесь может быть что угодно) наук, профессор Фамилия Имя Отчество
Официальные оппоненты: Доктор биологических наук, профессор Фамилия1 Имя1 Отчество1 Доктор биологических наук, профессор Фамилия2 Имя2 Отчество2


Так вот надо вытащить:
1 - Доктор(или кандидат) биологических(здесь может быть что угодно) наук
2 - профессор
3 - Фамилия Имя Отчество

Соответственно и для второй строки нужно тоже самое, только для двух людей.

Не могу сообразить какую либо общую функцию.
PM MAIL   Вверх
Arantir
Дата 10.3.2013, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Зачем вам вытаскивать слово "профессор"?
Приведите какой-то более конкретный пример (с любыми именами, но человеческими) и массив данных, которые вы должны получить из этого примера в результате применения регулярного выражения.
А то непонято, то ли везде "Доктор биологических наук", то ли вам надо строку после "Научный руководитель:". А так же, надо ли вам только первое ФИО или каждое. И что за "Фамилия1 Имя1 Отчество1 Доктор биологических наук" без разделительный знаков.
 Поменьше абстрагируйтесь в примерах.

Это сообщение отредактировал(а) Arantir - 10.3.2013, 20:36


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Dup13x
Дата 11.3.2013, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Научный руководитель: Доктор биологических наук, профессор Каываа Нвыаывя Абропроповна
Официальные оппоненты: Доктор биологических наук, профессор Лфывако Маываина Влавыаовна Доктор биологических наук, профессор Меываов Генывадий Февыаович

Научный руководитель: Доктор биологических наук, профессор С23432ев Н23423лай Николаевич
Официальные оппоненты: Доктор медицинских наук, доцент Ос234шая Лю324ла Бо32423на Доктор биологических наук, профессор С23423ов 324лий Га32423лович


$degree = "/(доктор|кандидат)/i";
$title = "/(профессор|доцент|Старший научный сотрудник|Младший научный сотрудник|Академик РАН|Академик РАМН|Академик РАСХН|Академик РАО|Академик РААСН|Академик РАХ|Член-корреспондент РАН|Член-корреспондент РАМН|Член-корреспондент РАСХН|Член-корреспондент РАО|Член-корреспондент РААСН)/i";

PM MAIL   Вверх
Arantir
Дата 11.3.2013, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Самое универсальное, что смог придумать:
Код
(?: )([А-Я][а-я]*?)(?: )(?:.*?наук, )(.*?)(?: )(\S+ \S+ \S+)

http://regexr.com?3434b

Если "Доктор" может начинаться с прописной буквы, но придется сделать так:
Код

(доктор|кандидат)(?:.*?наук, )(.*?)(?: )(\S+ \S+ \S+)
с регистронезависимостью. Потому что в первом варианте ориентиром начала подстроки служила строчная буква.

На выходе из preg_match_all() вы получите массив с массивами групп. Первый индекс + 1 — это группа в паттернте, второй — порядковый номер доктора/кандидата по мере поиска в строках.
Код

$subject = <<<text
Научный руководитель: Доктор биологических наук, доцент Каываа Нвыаывя Абропроповна
Официальные оппоненты: Доктор биологических наук, профессор Лфывако Маываина Влавыаовна Кандидат биологических наук, профессор Меываов Генывадий Февыаович
text;
$pattern = "/(?: )([А-Я][а-я]*?)(?: )(?:.*?наук, )(.*?)(?: )(\S+ \S+ \S+)/u";
preg_match_all($pattern, $subject, $matches);

// $matches[1][0] == "Доктор",  $matches[1][1] ==  "доцент", $matches[1][2] == "Каываа Нвыаывя Абропроповна"
// $matches[3][0] == "Кандидат",  $matches[3][1] ==  "профессор", $matches[3][2] == "Меываов Генывадий Февыаович"


Это сообщение отредактировал(а) Arantir - 11.3.2013, 19:52


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Dup13x
Дата 11.3.2013, 22:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, что натолкнули на идею, я лучше понял ленивые вычисления.

наверное мне нужно что-то типа такого
Код

$pattern = "/((доктор|кандидат).*?наук)\W*(профессор|доцент)? (\S+ \S+ \S+).*?/i";

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


 




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


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

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