Предыдущее слово с помощью регулярного выражения

Невский

Новичок
Предыдущее слово с помощью регулярного выражения

Есть определенная переменная данные в которую могут поступать из формы или файла. Нужно найти в тексте ФИО человека (которое задано именно в последовательности ФИО), за начало поиска и определения пола берется окончания отчества "вна|вич", первый раз использую регулярные и что накопал, у меня выводит "Отчество" и всю строку до начала, а нужно взять только 2 предыдщих слова, т.е "Имя" и "Фамилия" (даже если фамилия будет на предыдущей строке),
PHP:
$string="Какой то текст
Какая-то фамилия
на одной 
или двух строках Иванов Иван Иванович такой есть
и опять какой то текст"; 
preg_match('/(.*?)((\S*)вна|(\S*)вич)/i', $string, $d);    
echo "В тексте найдено: ФИО <b>$d[0]</b><br>";
Заранее спасибо.
 

vovanium

Новичок
Подсказка: \s - означает пробельные символы включая пробелы, табы, переводы строк.
Как можно обозначить слово в регулярке, это 1 или более непробельный символ, за которым следует 1 или более пробельный символ, регулярка очень простая
Плюс почитай разницу между * и +
 

Невский

Новичок
Автор оригинала: vovanium
Подсказка: \s - означает пробельные символы включая пробелы, табы, переводы строк.
Как можно обозначить слово в регулярке, это 1 или более непробельный символ, за которым следует 1 или более пробельный символ, регулярка очень простая
Плюс почитай разницу между * и +
Спасибо.

Действительно, пока разобрал эту "китайскую грамоту", полностью запутался, а такие примеры приводятся в самом начале при описании регулярных выражений. Мне нужно было взять 2 предыдущих слова, а это значит (\w*\s+)(\w*\s+) или (\w*\s+){2}

Конечно может где-то и ошибаюсь в синтаксе, но по крайней мере работает:
PHP:
$string="Какой то текст
Какая-то фамилия
на одной
или двух строках Иванов
Иван Иванович такой есть
и опять какой то текст";    
preg_match('/(\w*\s+){2}((\S*)вна|(\S*)вич)/i', $string, $d);
echo "В тексте найдено: ФИО <b>$d[0]</b><br>";
Еще раз спасибо.
 

vovanium

Новичок
еще раз почитай про "*" и "+" :)
у тебя регулярка будет работать при
$string=" вич";
т.е. будет считать что фамилия и имя пустое, а отчество "вич"
 

DiMA

php.spb.ru
Команда форума
\w - это символы: a-z а-я 0-9 -
тебе нужно сократить до а-я -
 

Невский

Новичок
еще раз почитай про "*" и "+" у тебя регулярка будет работать при $string=" вич"; т.е. будет считать что фамилия и имя пустое, а отчество "вич"
Ок. Прочту и протестирую.
Спасибо

-~{}~ 15.03.09 22:39:

Автор оригинала: DiMA
\w - это символы: a-z а-я 0-9 -
тебе нужно сократить до а-я -
То есть исключить цифры?
А впрочем и латиницу тоже можно исключить.

Спасибо.
 

prolis

Новичок
я бы отказался от "вна/вич" (некоторые пишут ИОФ), а искал бы три слова с большой буквы
 

Невский

Новичок
Автор оригинала: vovanium
еще раз почитай про "*" и "+" :)
у тебя регулярка будет работать при
$string=" вич";
т.е. будет считать что фамилия и имя пустое, а отчество "вич"
Понял в чем разница, символ обязательно должен быть, я также добавил "." перед "вна"

-~{}~ 16.03.09 12:56:

Автор оригинала: prolis
я бы отказался от "вна/вич" (некоторые пишут ИОФ), а искал бы три слова с большой буквы
Да в некоторых случах так бывает, но в моем случае это редкость, тем не меннее я это учту. Спасибо.
 

yok

Новичок
Добрый день.
В диалекте пхп не знаю, а в диалекте перл
([\w]+)\s+([\w]+)\s+((?<=вна)|(?<=вич))

Скажите пожалуйста в пхп работает позиционная опережающая, ретроспективная и соответсвенно негативная проверка?

И позиционная проверка сохраняется в $?
 

Beavis

Banned
yok
ты думаешь он 7 месяцев сидел и ждал пока ты ему поможешь? диггер
 

Невский

Новичок
Конечно же не ждал. То что я написал, так замечательно обрабатывает информацию из резюме, что просто сэкономлено тысячи человеко-часов. - вна и -вич не всегда срабатывает, так ка есть такое отчество "Ильич", здесь другое окончание должно быть :) Спасибо.
 

yok

Новичок
'/(\w*\s+){2}((\S*)вна|(\S*)вич)/i'
Всем хорошего дня.
Невский, ты пишешь что то что написал хорошо работает, если это, то имей в виду что подвыражение \w*\s+ допускает просто ничего, и пусто, *-это допускает ничего, поетому само регулярное =пусто пусто хххвна|хххвич
Конечно он не ждал 7месяцев советы, просто в споре рождается истина, общение учит. А учится ох как есть чему.
Вот у меня вопрос, есть в диалекте пхп позиционные опережающие проверки, ретроспективные и негативные.
(?<! ) и сохраняется ли такое подвыражение в $???

-~{}~ 05.10.09 09:34:

Невский извини, не написал сразу,
(\w+\s+) нужен квантификатор +, он обязывает хоть один символ.

-~{}~ 05.10.09 09:42:

А вот кстати насчет Ильич, тут может оттолкнуться от того, что все три слова Иванов Иван Ильич c больших букв. Есть в регулярных буква в верхнем регистре?
 

yok

Новичок
preg_match_all('/([А-Я]\w+)\s+([А-Я]\w+)\s+([А-Я]\w)+\s+/',$text,$matches);
for($i=0;$i<count($matches[0]);$i++) { //цикл если в тексте будет неcколько фио
echo "matched: ".$matches[0][$i]."\n";
echo "family: ".$matches[1][$i]."\n";
echo "name: ".$matches[2][$i]."\n";
echo "otchestvo: ".$matches[3][$i]."\n";
}
а если всего один раз будет фио то
print "fio is: ".$matches[0][0]." family is :".$matches[1][0]."name ".$matches[2][0]." otchestvo ".$matches[3][0];
Думаю три слова подряд с заглавной буквы будут только у фио.

-~{}~ 05.10.09 14:45:

Уточняю, если в тексте только один фио, то нет необходимости и целесообразности в preg_match_all, достаточно preg_match , эта all аналог /g

-~{}~ 05.10.09 14:47:

да и массив тогда шаблон [0] фамилия 1 имя 2
 
Сверху